PIKADEMIA

Projekt edukacji alternatywnej

Zapytania MySQL z różnych tabel w wordpress

Relacyjna baza danych polega na tym, że dane umieszcza się w różnych tabelach, a następnie nawiązuje się relacje pomiędzy nimi. Czasami robimy to bezpośrednio, jedna tabela z drugą lub za pomocą trzeciej tabeli, która zawiera w sobie same powiązania. Tak jak np. w wordpresie posty umieszczone są w jednej tabeli, w której również umieszczony jest numer id autora (post_author). Wszelkie informacje o autorze są jednak przechowywane w osobnej tabeli, tj: wp_users. Aby pobrać informacje o autorze konkretnego postu (poza jego id), należy w zapytaniu podać jaka występuje pomiędzy tymi tabelami relacja. Jak zauważycie w tabeli wp_posts mamy tzw. klucz obcy do tabeli o autorze (post_author), któremu odpowiada klucz główny (ID) w tabeli wp_users. W zapytaniu więc musimy to podać, że kolumna post_author w tabeli wp_posts = kolumnie ID w tabeli wp_users. To jest jeden z przykładów łączenia tabel (wg. mnie najłatwiejszy 😉

Wyświetl tytuły opublikowanych artykułów i pseudonimy ich autorów

SELECT p.post_title, u.user_nicename 
FROM `wp_posts` p, `wp_users` u
WHERE p.post_author=u.ID AND post_type='post' AND post_status='publish'

W tabeli z postami nie zobaczymy żadnej wzmianki o kategorii postu. Nazwy kategorii umiesczone są w tabeli wp_terms. Jednak nie możemy bezpośrednio połączyć się z tą tabelą ponieważ nie ma w niej klucza prowadzącego do postów, a w postach nie ma klucza prowadzącego do kategorii. W tym przypadku została stworzona trzecia tabela o nazwie wp_term_relationships, która łączy posty i kategorie. Zobaczymy w niej klucz obcy do object_id(czyli do id postu) i do term_taxanomy_id(klucz do kategorii). Co prawda ten drugi klucz odnosi się do jeszcze pośredniej tabeli, ale ponieważ wartości są takie same to możemy pójść na skróty i uznać, że ten klucz prowadzi do naszych kategorii. W tej sytuacji więc musimy połączyć tabele dwukrotnie. Tabelę z wp_posts z tabelą wp_term_relationships oraz tabelę wp_terms z tabelą wp_term_relationships.

Wyświetl tytuły opublikowanych artykułów wraz z nazwami ich kategorii

SELECT p.post_title, c.name
FROM `wp_posts` p, `wp_terms` c, `wp_term_relationships` r 
WHERE p.ID=r.object_id AND c.term_id=r.term_taxonomy_id
AND p.post_type='post' AND p.post_status='publish'

Tak jak mówiłem powyższe zapytanie jest pewnym uproszczeniem, jeśli chcielibyśmy być bardziej dokładni, to należałoby ująć w zapytaniu jeszcze tabelę wp_term_taxonomy ponieważ ona jest łącznikiem pomiędzy nazwami kategorii, a tabelą z relacjami. W poniższym przykładzie wybierzemy tytuł wszystkich opublikowanych artykułów i nazwę kategorii, które należą do kategorii o id 6

SELECT p.post_title, c.name
FROM `wp_posts` p, `wp_terms` c, `wp_term_taxonomy` t, `wp_term_relationships` r
WHERE p.ID=r.object_id AND c.term_id=t.term_id AND t.term_taxonomy_id=r.term_taxonomy_id
AND p.post_type='post' AND p.post_status='publish' AND t.term_taxonomy_id = 6

Jak widzicie poszczególne zapytania mogą czasem stawać się dość złożone, choć te powyżej raczej do nich nie należą 😉 Najważniejsze to na spokojnie przemyśleć i rozpisać wszystkie warunki oraz dobrze wykonać połączenia pomiędzy tabelami. Klucze obce w tabelach zazwyczaj są opisane nazwą innej tabeli, co zdecydowanie pomaga w nawiązywaniu połączeń. Np. w tabeli wp_term_taxonomy mamy kolumnę o nazwie term_id, co świadczy, że odnosi się ona do tabeli wp_terms i w taki sposób należy je połączyć 😉 Mam nadzieję, że teraz będzie Wam już łatwiej pobierać dane z bazy danych.