Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kolidująca funkcja MIN()
Forum PHP.pl > Forum > Bazy danych > MySQL
wujek2009
Cześć.

Przejdę od razu do konkretów. Próbuje pobrać najmniejszą kwotę (cenę) oraz liczbę dni przypisaną według danego sklepu. Ogólnie prawidłowo pobiera najniższą cenę, funkcja MIN() spełnia swoje założenia, ale pozostała część zapytania (tj: pobieranie dni, oraz id) - zwraca w ogóle inne, dziwne wartości, które nie należą do rekordu z najniższą ceną.

Zapytanie, które wykonuje:
  1. SELECT min(price) AS malo, days, id FROM `cennik` WHERE sklep_id = 2;


Wynik:
malo: 170 (dobrze),
days: 1,
id: 1

Pobiera najniższy wynik, ale później zapytanie pobiera pierwszy z brzegu rekord i zwraca mi dni: 1, id: 1 - a powinno zwrócić: 7 dni oraz id: 9.
Ktoś wie dlaczego tak się dzieje? Poniżej przedstawiam schemat tabeli wraz z danymi, na których operuje.

  1. CREATE TABLE IF NOT EXISTS `cennik` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `sklep_id` int(11) NOT NULL,
  4. `days` int(11) NOT NULL,
  5. `price` decimal(16,2) NOT NULL DEFAULT '0.00',
  6. PRIMARY KEY (`id`),
  7. KEY `sklep_id` (`sklep_id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=11 ;
  9.  
  10. INSERT INTO `cennik` (`id`, `sklep_id`, `days`, `price`) VALUES
  11. (1, 2, 1, 200.00),
  12. (2, 2, 2, 190.00),
  13. (3, 2, 3, 190.00),
  14. (4, 2, 4, 180.00),
  15. (5, 2, 5, 180.00),
  16. (6, 2, 6, 180.00),
  17. (9, 2, 7, 170.00),
  18. (10, 6, 1, 150.00);
mmmmmmm
Ja wiem. Bo to MySQL....
A tak serio, to złe zapytanie dajesz.
Powinno być:
  1. SELECT * FROM cennik WHERE price=(SELECT Min(price) FROM cennik)
wujek2009
Dość nieciekawie moja sytuacja wygląda - zapytanie z pierwszego posta to tak na prawdę jest wyodrębnione. Finalnie całe zapytanie będzie wyglądało tak:
  1. SELECT s.name, s.description, c.days, c.price AS tania_cena
  2. FROM `sklepy` AS `s`
  3. LEFT JOIN `cennik` AS `c`
  4. ON (c.sklep_id = s.id)
  5. WHERE s.country_id = 'pl' AND c.price = (SELECT MIN(p.price) AS inne FROM cennik AS p WHERE p.sklep_id = s.id GROUP BY p.sklep_id)
  6. GROUP BY s.id


Stosując Twój przykład - nadając dodatkowy warunek WHERE tak na prawdę ograniczę wynik tylko do jednego rekordu - jak usunę całkowicie ten warunek WHERE + podzapytanie to wówczas zwróci mi prawidłową liczbę, ale liczba dni będzie się niezgadzać :-/

Teraz tak myślę, aby to w ogóle rozbić na dwa zapytania - może ktoś z Was będzie miał inny pomysł to śmiało pisać :-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.