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.

Ask ChatGPT
Set ChatGPT API key
Find your Secret API key in your ChatGPT User settings and paste it here to connect ChatGPT with your Tutor LMS website.
Scroll to Top