Mam bazę danych MySQL Wordpress, której potrzebujęutwórz niestandardowe zapytanie o korzystanie z SQL. Próbuję zwrócić bieżące zdarzenie (post), gdzie wartość "date_start" jest mniejsza niż bieżący dzień, a wartość "date_end" jest większa lub równa bieżącemu dniu. Wiem, że istnieje rekord danych, który powinien zostać zwrócony, ale zwracana jest informacja, gdy próbuję wykonać wyszukiwanie zarówno "date_start", jak i "date_end"
To jest moja stara instrukcja SQL:
select ID, post_name, meta_id, meta_key, meta_value from wp_posts inner join wp_postmeta on wp_posts.ID = wp_postmeta.post_id and ((meta_key="date_end" and meta_value >= CURDATE() + interval 1 day) and (meta_key="date_start" and meta_value < CURDATE())) where post_type="programs" order by meta_value
Nowa instrukcja SQL:
SELECT
ID,
post_name,
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = "date_start") AS "date_start",
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = "date_end") AS "date_end"
FROM wp_posts
WHERE
post_type = "programs"
AND ((CURDATE() >= (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = "date_start"))
AND (CURDATE() <= (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = "date_end")))
ORDER BY `wp_posts`.`ID` ASC
A zwracana data to:
ID post_name date_start date_end
1221 culture-analytics 20160307 20160610
2446 culture-analytics-tutorials 20160308 20160311
Próbowałem również, gdzie część date_start i date_end sprzężenia wewnętrznego był w klauzuli WHERE.
WAŻNE: wp_postmeta jest schematem Many To 1, podczas gdy "date_start" i "date_end" są osobnymi rekordami, ale oba wskazują na ten sam PostID
Co wydaje się być problemem.
Odpowiedzi:
0 dla odpowiedzi № 1Masz dwa sprzeczne ograniczenia dla meta_key. Twoje zapytanie oczekuje, że meta_key będzie równy zarówno "date_start", jak i "date_end" w tym samym czasie.
Może wypróbuj coś takiego:
SELECT
ID,
post_name,
meta_id,
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = "date_start") AS "date_start",
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = "date_end") AS "date_end"
FROM wp_posts
WHERE
post_type = "programs"
AND (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = "date_start") < CURDATE()
AND (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = "date_end") >= (CURDATE() + INTERVAL 1 DAY)
ORDER BY 4
Nie mam dostępu do bazy danych Wordpress, więc nie uruchomiłem jej, ale może działać ...
0 dla odpowiedzi nr 2
@obe złapał podstawowy problem z pierwotnym zapytaniem w swojej odpowiedzi; ale rozwiązałbym go z dodatkowym sprzężeniem zamiast czterema podzapytaniami:
SELECT ID, post_name, meta_id
, beginMeta.meta_key As beginKey, endMeta.meta_key AS endKey
, beginMeta.meta_value AS beginDate
, endMeta.meta_value AS endDate
FROM wp_posts
INNER JOIN wp_postmeta AS endMeta
ON wp_posts.ID = endMeta.post_id
AND endMeta.meta_key="date_end"
AND endMeta.meta_value >= CURDATE() + interval 1 day
INNER JOIN wp_postmeta AS beginMeta
ON wp_posts.ID = beginMeta .post_id
AND beginMeta.meta_key="date_start"
AND beginMeta.meta_value < CURDATE()
WHERE post_type="programs"
ORDER BY beginDate, endDate
;
Edycja: Zakłada się, że kombinacje (post_id, meta_key) są unikalne w wp_postmeta.