Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kolidująca funkcja MIN()
wujek2009
post 2.10.2013, 18:25:17
Post #1





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
mmmmmmm
post 2.10.2013, 18:38:22
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
wujek2009
post 2.10.2013, 19:29:12
Post #3





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

Ostrzeżenie: (0%)
-----


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ć :-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:27