Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Niby prosty podselekt
Forum PHP.pl > Forum > Bazy danych > MySQL
ktuvok
Mam następującą strukturę danych:

Klienci:
---------------------
| ID | Imie |
---------------------
| 1 | Wacek |
| 2 | Teodor |
| 3 | Kleofas |
---------------------

Badania:
-----------------------------------
| IDKlienta | Data | Wynik |
-----------------------------------
| 1 | 2005-01-15 | 50 |
| 1 | 2005-03-17 | 70 |
| 3 | 2005-01-25 | 40 |
| 3 | 2005-02-28 | 85 |
-----------------------------------

Jak jednym zapytaniem pobrać wynik ostatniego badania każdego z klientów?
Chciałbym uzyskać coś takiego:

-----------------------
| IDKlienta | Wynik|
-----------------------
| 1 | 70 |
| 2 | NULL |
| 3 | 85 |
-----------------------

MySQL 4.1.x (możliwe podselekty)
ebe
a czy rzypadkiem tabela badania nie powinna mieć swojego klucza? I wtedy mozna sortować po kluczu. Ew. w tym projekcie mozesz sortować po dacie ale co bedzie jak bedzie ta sama? Ja bym dodał unikalną auto_incrementowaną kolumnę do bazy badania.
ktuvok
Masz rację, zaraz po wysłaniu posta dodałem kolumnę

IDBadania INT(11) AUTO_INCREMENT PRIMARY KEY

Tyle, że nie przybliża mnie to do rozwiązania...
SongoQ
  1. SELECT
  2. *
  3. FROM Klienci LEFT JOIN Badania ON (Klienci.Id = Badania.IDKlienta),
  4. (SELECT MAX(ID) AS a
  5. FROM Badania GROUP BY IDKlienta) tab
  6. WHERE tab.a = Badania.ID


Jesli nie bedzie dzialac to pisz, pisalem nie sprawdzajac. Ale jesli podzapytania CI dzialaja to powinno zadzialac.
ktuvok
Otrzymuję Empty Set!

A przecież dane są...
SongoQ
Mozesz zrobic zrzut sqla tabel i danych to pokombinuje.
ktuvok
Proszę bardzo:

  1. CREATE TABLE Klienci (
  2. IDKlienta INT(11) AUTO_INCREMENT,
  3. Imie VARCHAR(25),
  4. PRIMARY KEY (IDKlienta))
  5. TYPE=InnoDB;
  6.  
  7. CREATE TABLE Badania (
  8. IDBadania INT(11) AUTO_INCREMENT,
  9. IDKlienta INT(11) DEFAULT 0,
  10. DataBadania DATE,
  11. Wynik INT(11),
  12. PRIMARY KEY (IDBadania),
  13. KEY (IDKlienta))
  14. TYPE=InnoDB;
  15.  
  16. INSERT
  17. INTO Klienci (Imie) VALUES ('Wacek');
  18. INSERT
  19. INTO Klienci (Imie) VALUES ('Teodor');
  20. INSERT
  21. INTO Klienci (Imie) VALUES ('Kleofas');
  22.  
  23. INSERT
  24. INTO Badania (IDKlienta, DataBadania, Wynik) VALUES (1, '2005-01-15', 50);
  25. INSERT
  26. INTO Badania (IDKlienta, DataBadania, Wynik) VALUES (1, '2005-03-17', 70);
  27. INSERT
  28. INTO Badania (IDKlienta, DataBadania, Wynik) VALUES (3, '2005-01-25', 40);
  29. INSERT
  30. INTO Badania (IDKlienta, DataBadania, Wynik) VALUES (3, '2005-02-28', 85);


Z góry dziękuję i pozdrawiam,
K
Draugfor
No witam,
u mnie to dziala:

  1. mysql> SELECT ID, wynik
  2. FROM klienci LEFT JOIN badania ON klienci.ID=badania.ID
  3. Klienta WHERE badania.DATA=(SELECT max(DATA)
  4. FROM badania WHERE IDKlienta=klienci
  5. .ID) OR badania.DATA IS NULL;


Kod
+----+--------+
| ID | wynik |
+----+--------+
|  1 |     70 |
|  2 |   NULL |
|  3 |     85 |
+----+--------+
3 rows in set (0.02 sec)


Prosze zwrocic uwage, ze moj stary komputer dal rade to w stosunkowo szybkim czasie obliczyc. aarambo.gif
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.