【问题标题】:SQL Multiple WHERE INSQL 多个 WHERE IN
【发布时间】:2014-12-10 13:53:00
【问题描述】:

我正在尝试从需要执行 3 个条件的 wp_posts 表中选择 ID。

  1. ID 是否与 wp_postmeta 表中的 post_id 匹配,其中 meta_key = ' gtp_analytics_client_id' 并且 meta_value 不为空。

  2. ID 是否与 wp_postmeta 表中的 post_id 匹配,其中 meta_key = ' gtp_conversion_uploaded' 并且 meta_value 不等于 1。

  3. ID 是否与 wp_postmeta 表中的 post_id 匹配,其中 meta_key = 'gtp_lead_revenue' 和meta_value 不为空。

我是 SQL 的初学者。这就是我现在拥有的,但我不能使用多个 IN。所以我想我需要换一种方式。

SELECT ID 
FROM wp_posts 
WHERE ID IN (SELECT post_id 
             FROM wp_postmeta 
             WHERE meta_key = 'gtp_analytics_client_id' AND meta_value != '') 
AND IN (SELECT post_id 
        FROM wp_postmeta 
        WHERE meta_key = 'gtp_conversion_uploaded' AND meta_value != 1)
AND IN (SELECT post_id 
        FROM wp_postmeta 
        WHERE meta_key = 'gtp_revenue' AND meta_value != '')

我收到以下错误:

您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行的 'IN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'gtp_conversion_uploaded' A' 附近使用正确的语法

【问题讨论】:

  • 上面的代码有没有报错?
  • @Matt 是的。我已将错误添加到我的问题中。
  • 试试我的答案,应该可行

标签: mysql sql database wordpress phpmyadmin


【解决方案1】:

and 不是 in 运算符的一部分,它是三个独立的 in 运算符,因此您需要所有它们的第一个操作数 (ID):

SELECT ID 
FROM wp_posts 
WHERE ID IN ( ... ) 
AND ID IN ( ... )
AND ID IN ( ... )

你也可以写成三个连接:

SELECT
  p.ID
FROM
  wp_posts p
  INNER JOIN wp_postmeta m1 ON m1.post_id = p.ID AND m1.meta_key = 'gtp_analytics_client_id' AND m1.meta_value != ''
  INNER JOIN wp_postmeta m2 ON m2.post_id = p.ID AND m2.meta_key = 'gtp_conversion_uploaded' AND m2.meta_value != 1
  INNER JOIN wp_postmeta m3 ON m3.post_id = p.ID AND m3.meta_key = 'gtp_revenue' AND m3.meta_value != ''

【讨论】:

  • 您的回答在我看来是最好的。您能解释一下您在 JOIN 示例中所做的事情吗?
  • @Robbert:内连接与where id in (...)具有相同的限制结果效果。
【解决方案2】:

当它可以是三种情况中的任何一种时

SELECT ID 
FROM wp_posts 
WHERE ID IN (SELECT post_id 
             FROM wp_postmeta 
             WHERE (meta_key = 'gtp_analytics_client_id' AND meta_value != '')
             OR (meta_key = 'gtp_conversion_uploaded' AND meta_value != 1)
             OR (meta_key = 'gtp_revenue' AND meta_value != '')
            ) 

【讨论】:

  • 但在这种情况下,并非所有 3 个条件都为真,对吧?
  • 对不起,没有语法错误。我的错。但是检查 meta_key 的仍然不是我的意思。
  • 没问题,删除评论就行了,免得以后混淆。关于元键,发布我的代码输出的横截面,然后发布它应该在您的问题中显示的示例输出,我们可以从那里开始。
  • 第二个查询的子查询永远不会返回任何内容,因为meta_key 不能同时是不同的值
【解决方案3】:
SELECT p.ID 
FROM wp_posts p
JOIN wp_postmeta m on p.id = m.post_id
group by p.id
having sum(m.meta_key = 'gtp_analytics_client_id' AND m.meta_value != '') > 0
and sum(m.meta_key = 'gtp_conversion_uploaded' AND m.meta_value != 1) > 0
and sum(m.meta_key = 'gtp_revenue' AND m.meta_value != '') > 0

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2012-03-12
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多