Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Niby prosty podselekt
ktuvok
post
Post #1





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

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


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)
Go to the top of the page
+Quote Post
ebe
post
Post #2





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 23.01.2004

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


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.

Ten post edytował ebe 27.04.2005, 17:14:46


--------------------
Słyszałem, że macie tutaj jakieś takie php... fajne to, dobre to jest?
Go to the top of the page
+Quote Post
ktuvok
post
Post #3





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

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


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...
Go to the top of the page
+Quote Post
SongoQ
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


  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.


--------------------
Go to the top of the page
+Quote Post
ktuvok
post
Post #5





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

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


Otrzymuję Empty Set!

A przecież dane są...
Go to the top of the page
+Quote Post
SongoQ
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Mozesz zrobic zrzut sqla tabel i danych to pokombinuje.


--------------------
Go to the top of the page
+Quote Post
ktuvok
post
Post #7





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

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


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
Go to the top of the page
+Quote Post
Draugfor
post
Post #8





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 13.07.2003
Skąd: Torun/Poznan

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


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


--------------------
On the day I was born, the nurses all gathered 'round
And they gazed in wide wonder, at the joy they had found
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 Aktualny czas: 21.08.2025 - 20:58