Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> SQL Query - pytanie
one_eddie
post
Post #1





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 23.05.2003
Skąd: Polska

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


Robie skrypt, aby usprawnic obsluge mojej domowej prywatnej biblioteczki.
Czesto pozyczam ksiazki i zapominam o tym a znudzilo mi sie zapisywanie na karteczkach ktore czesto sie gubia.

Chcialem uzyskac wszystkie wypozyczone ksiazki przez dana osobe, pozyskac nazwy osoby ktora wypozyczyla oraz dane dokumentu oraz pare innych danych.

Napisalem takie zapytanie:

  1. SELECT le.Id, le.LendDate, DATEDIFF(CURDATE(), STR_TO_DATE(le.LendDate,'%d/%m/%Y')) AS LendDays, le.MaxLendTime, le.PersonId, p.SurName, p.ForeName, le.ItemID, d.Title, d.Author
  2. FROM lended le LEFT JOIN persons p , documents d ON (le.PersonId = p.Id AND d.Id = le.ItemId ) ORDER BY le.LendDate, LendDays;


Ale wyswietlalo niepoprawne wyniki:
Kod
+----+------------+----------+-------------+----------+---------+-----------+--------+------------------+---------+
| Id | LendDate   | LendDays | MaxLendTime | PersonId | SurName | ForeName  | ItemID | Title            | Author  |
+----+------------+----------+-------------+----------+---------+-----------+--------+------------------+---------+
|  7 | 26/07/2005 |        2 |          21 |        1 | Bl      | Krz       |      2 | Rozwijanie poj?? | Henryk  |
|  8 | 26/07/2005 |        2 |          14 |        1 | B       | K         |     12 | NULL             | NULL    |
|  7 | 26/07/2005 |        2 |          21 |        1 | B       | K         |      2 | NULL             | NULL    |
|  6 | 26/07/2005 |        2 |          14 |        2 | Bl      | Krz       |      1 | NULL             | NULL    |
|  6 | 26/07/2005 |        2 |          14 |        2 | B       | K         |      1 | Matematyka nauk? | W.W.Saw |
|  8 | 26/07/2005 |        2 |          14 |        1 | Bl      | Krz       |     12 | c++              | tony.l  |
+----+------------+----------+-------------+----------+---------+-----------+--------+------------------+---------+


Wiec poprawilem to tak

  1. SELECT le.Id, le.LendDate, DATEDIFF(CURDATE(), STR_TO_DATE(le.LendDate,'%d/%m/%Y')) AS LendDays, le.MaxLendTime, le.PersonId, p.SurName, p.ForeName, le.ItemID, d.Title, d.Author
  2. FROM lended le LEFT JOIN persons p , documents d ON (le.PersonId = p.Id AND d.Id = le.ItemId) WHERE d.Title!='' ORDER BY le.LendDate, LendDays;


Kod
+----+------------+----------+-------------+----------+---------+-----------+--------+---------+---------+
| Id | LendDate   | LendDays | MaxLendTime | PersonId | SurName | ForeName  | ItemID | Title   | Author  |
+----+------------+----------+-------------+----------+---------+-----------+--------+---------+---------+
|  6 | 26/07/2005 |        2 |          14 |        2 | B       | K         |      1 | Matemat | W.W.Saw |
|  7 | 26/07/2005 |        2 |          21 |        1 | Bl      | Krz       |      2 | Rozwija | Henryk  |
|  8 | 26/07/2005 |        2 |          14 |        1 | Bl      | Krz       |     12 | c++     | tony.l  |
+----+------------+----------+-------------+----------+---------+-----------+--------+---------+---------+


Pozbylem sie nuli ale chcialem jeszcze uzyskac dla konkretnej osoby a nie wszystkie wiec zrobilem tak:

  1. SELECT le.Id, le.LendDate, DATEDIFF(CURDATE(), STR_TO_DATE(le.LendDate,'%d/%m/%Y')) AS LendDays, le.MaxLendTime, le.PersonId, p.SurName, p.ForeName, le.ItemID, d.Title, d.Author
  2. FROM lended le LEFT JOIN persons p , documents d ON (le.PersonId = p.Id AND d.Id = le.ItemId) WHERE (d.Title!='' AND p.Id = 1) ORDER BY le.LendDate, LendDays;


Kod
+----+------------+----------+-------------+----------+---------+-----------+--------+--------+----------+
| Id | LendDate   | LendDays | MaxLendTime | PersonId | SurName | ForeName  | ItemID | Title  | Author   |
+----+------------+----------+-------------+----------+---------+-----------+--------+--------+----------+
|  7 | 26/07/2005 |        2 |          21 |        1 | Bl      | Krz       |      2 | Rozwij | Henryk M |
|  8 | 26/07/2005 |        2 |          14 |        1 | Bl      | Krz       |     12 | c++    | tony.l h |
+----+------------+----------+-------------+----------+---------+-----------+--------+--------+----------+


  1. SELECT le.Id, le.LendDate, DATEDIFF(CURDATE(), STR_TO_DATE(le.LendDate,'%d/%m/%Y')) AS LendDays, le.MaxLendTime, le.PersonId, p.SurName, p.ForeName, le.ItemID, d.Title, d.Author
  2. FROM lended le LEFT JOIN persons p , documents d ON (le.PersonId = p.Id AND d.Id = le.ItemId) WHERE (d.Title!='' AND p.Id = 2) ORDER BY le.LendDate, LendDays;


Kod
+----+------------+----------+-------------+----------+---------+----------+--------+-----------+---------+
| Id | LendDate   | LendDays | MaxLendTime | PersonId | SurName | ForeName | ItemID | Title     | Author  |
+----+------------+----------+-------------+----------+---------+----------+--------+-----------+---------+
|  6 | 26/07/2005 |        2 |          14 |        2 | B       | K        |      1 | Matematyk | W.W.Sar |
+----+------------+----------+-------------+----------+---------+----------+--------+-----------+---------+


No ale zapytanie zrobilo sie kolosalne i malo czytelne. Pozatym watpie czy bedzie dzialac poprawnie jesli zabraknie ktorejs z danych.

Macie jakis pomysl jak to zapisac inaczej?
Bede wdzieczny za kazda pomoc :]
Go to the top of the page
+Quote Post
popbart
post
Post #2





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

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


  1. SELECT le.Id, le.LendDate, DATEDIFF(CURDATE(), STR_TO_DATE(le.LendDate,'%d/%m/%Y')) AS LendDays, le.MaxLendTime, le.PersonId, p.SurName, p.ForeName, le.ItemID, d.Title, d.Author
  2. FROM (lended le LEFT JOIN persons p ON (le.PersonId = p.Id)) INNER JOIN documents d ON(d.Id = le.ItemId)
  3. WHERE p.Id = 2 AND d.Title!=''
  4. ORDER BY le.LendDate, LendDays;

Zapytanie może większe ale logiczne - w poprzednim zapytaniu najpierw robiłeś left join do dokumentów a potem w WHERE dałeś warunek wykluczający puste dokumenty (d.Title!='').
Cytat
No ale zapytanie zrobilo się kolosalne i mało czytelne.

Czytelność zależy od formatowania, a kolosalne to ono nie jest (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 17:49