Zagnieżdżanie zapytań i wyszukiwanie danych w dwóch tabelach

Stronę tą wyświetlono już: 185 razy

Drodzy Czytelnicy, jak zapewne już wiecie, życie to nie jest bajka tak więc czas zakasać rękawy i zapoznać się z nieco trudniejszymi zapytaniami zagnieżdżonymi i sposobem wyszukiwania danych w dwóch tabelach. Zanim jednak, to najpierw konieczne jest utworzenie w istniejącej już bazie danych library nie jednej a dwóch dodatkowych tabel:

  • users - tabela wypożyczających:

    Listing 1
    1. CREATE TABLE users
    2. (
    3. id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    4. name CHAR(255),
    5. surname CHAR(255)
    6. );
  • rent - tabela, która będzie łączyła użytkownika z daną książką, ta tabela powinna mieć datę wypożyczenia i oddania książki, ale (mówiąc szczerze) na razie zostawmy to sobie na później:

    Listing 2
    1. CREATE TABLE users
    2. (
    3. id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    4. id_book INT UNSIGNED,
    5. id_user INT UNSIGNED
    6. );

Ponieważ tabele w tej chwili świecą pustkami, wrzućmy do nich niezwłocznie kilka rekordów danych. Dla tabeli users:

Listing 3
  1. insert into users (name, surname) value
  2. ('Adam', 'Kowalski'),
  3. ('Zenon', 'Pietrucha'),
  4. ('Grzegoż', 'Brzęczyszczykiewicz'),
  5. ('Leon', 'Zawodowiec'),
  6. ('Ania', 'Kopała');

I dla tabeli rent, ale (uwaga, uwaga) z wykorzystaniem polecenia SELECT wewnątrz polecenia INSERT:

Listing 4
  1. insert into rent (id_book, id_user) value
  2. ((select id from books where title='Rio Anaconda'), (select id from users where surname = 'Kowalski')),
  3. ((select id from books where title='Odyseja kosmiczna 2010'), (select id from users where surname = 'Kowalski')),
  4. ((select id from books where title='Odyseja kosmiczna 2001'), (select id from users where surname = 'Zawodowiec'));

Spójrzmy teraz, jak wspaniale wygląda nasza tabelka rent:

mysql> select * from rent;
+----+---------+---------+
| id | id_user | id_book |
+----+---------+---------+
|  1 |       1 |      12 |
|  2 |       1 |       9 |
|  4 |       4 |       8 |
+----+---------+---------+
3 rows in set (0.00 sec)

mysql>

No cóż, szału nie ma, ale takie jest życie. Nie ma co płakać, czas wyświetlić wszystkie książki, jakie wypożyczył użytkownik o nazwisku Kowalski. Zapytanie będzie wyglądało tak:

Listing 5
  1. SELECT books.title, books.author FROM books, rent WHERE rent.id_book = books.id AND rent.id_user = (SELECT id FROM USERS WHERE surname = 'Kowalski');

I cóż my tu u licha mamy? Nie dość, że wykorzystane zostało zagnieżdżone polecenie SELECT to nawiązane zostało połączenie pomiędzy dwiema tabelami: books i rent.

Wynik powyższego zapytania wpisanego w konsoli będzie wyglądał następująco:

mysql> select books.title, books.author from books, rent where rent.id_book = books.id and rent.id_user = (select id from users where surname = 'Kowalski');
+------------------------+-----------------+
| title                  | author          |
+------------------------+-----------------+
| Rio Anaconda           | W. Cejrowski    |
| Odyseja kosmiczna 2010 | Arthur C. Clark |
+------------------------+-----------------+
2 rows in set (0.00 sec)

mysql>

Komentarze