/ / Zapytanie MySql nie zwraca poprawnych danych - mysql, wordpress, wewnętrzna łączenie, klauzula where, porównanie dat

Zapytanie MySql nie zwracające poprawnych danych - mysql, wordpress, wewnętrzne sprzężenie, klauzula where, porównanie dat

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 № 1

Masz 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.