我试图通过JOIN从我的Wordpress数据库中获取SQL数据,但是我没有让它工作。
我需要什么:
我的问题:
我现在只获得帖子有meta_key“gtp_product_dont_show”的结果,但也有帖子没有这个键,我也需要这些。
这就是我现在所拥有的:
SELECT
ID, post_title
FROM
wp_posts p
JOIN wp_postmeta m ON
p.ID = m.post_id AND
m.meta_key = 'gtp_product_dont_show' AND
m.meta_value != 'true'
WHERE
post_type = 'products' AND
post_status = 'publish'
输出:
答案 0 :(得分:1)
您需要left join
:
SELECT ID, post_title
FROM wp_posts p LEFT JOIN
wp_postmeta m
ON p.ID = m.post_id AND
m.meta_key = 'gtp_product_dont_show'
WHERE (m.meta_value is null or m.meta_value <> 'true') and
post_type = 'products' AND
post_status = 'publish';
left join
在wp_postmeta
表中查找适当的密钥。 where
子句然后说&#34;当没有匹配或值不是真时保留记录&#34; - 我认为这是你正在寻找的逻辑。
答案 1 :(得分:0)
你在找这个吗?
SELECT
ID, post_title
FROM
wp_posts p
WHERE
post_type = 'products' AND
post_status = 'publish' AND
not exists (
select 1
from wp_postmeta m
where
p.ID = m.post_id AND
m.meta_key = 'gtp_product_dont_show' AND
m.meta_value = 'true')
这将从wp_posts中获取所有行,但是忽略那些从wp_postmeta找到行的地方,其中meta_key是gtp_product_dont_show且值为true。
答案 2 :(得分:0)
您可以使用OR
运算符来考虑这两种情况。试试这个:
SELECT stuff
FROM myTable
JOIN otherTable ON
(m.meta_key = 'gtp_product_dont_show' AND m.meta_value != 'true') OR
(m.meta_key != 'gtp_product_dont_show')
...
只是旁注,我不建议将布尔值存储为类似的字符串。您应该考虑使用TINYINT()
,其中布尔字段存储为0表示为false,或者1表示为true。