Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SQL Query - pytanie
Forum PHP.pl > Forum > Bazy danych > MySQL
one_eddie
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 :]
popbart
  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 smile.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.