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:
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 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 |
+----+------------+----------+-------------+----------+---------+-----------+--------+------------------+---------+
| 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
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 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 |
+----+------------+----------+-------------+----------+---------+-----------+--------+---------+---------+
| 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:
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 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 |
+----+------------+----------+-------------+----------+---------+-----------+--------+--------+----------+
| 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 |
+----+------------+----------+-------------+----------+---------+-----------+--------+--------+----------+
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 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 |
+----+------------+----------+-------------+----------+---------+----------+--------+-----------+---------+
| 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 :]