where 子句中的 MySQL 子查询

Posted

技术标签:

【中文标题】where 子句中的 MySQL 子查询【英文标题】:MySQL subquery in where clause 【发布时间】:2013-03-15 09:59:09 【问题描述】:

我有一个这样的 mysql 查询:

select 
    *, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'firm' and user_id = s.user_id 
        limit 1) 
        as firm, 
    (select meta_value f
        rom nord_usermeta m 
        where meta_key = 'first_name' and user_id = s.user_id 
        limit 1) 
    as first_name, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'last_name' and user_id = s.user_id 
        limit 1) 
    as last_name     
    from nord_submissions s 
    order by created_at desc

现在我需要使用这样的 where 子句来缩小范围:

select 
    *, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'firm' and user_id = s.user_id 
        limit 1) 
        as firm, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'first_name' and user_id = s.user_id 
        limit 1) 
    as first_name, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'last_name' and user_id = s.user_id 
        limit 1) 
    as last_name 

    from nord_submissions s 
    where firm like '%DG%' 
    order by created_at desc

问题显然在于我使用子查询的方式,但我找不到在 where 子句中引用它的方法。 请帮忙。

【问题讨论】:

“问题” .. 什么问题?您能否用错误消息/示例数据库架构/示例数据等扩展您的问题 - 甚至可能是一个小提琴sqlfiddle.com/about.html firm 是用户定义的列..我们也可以称它为虚构列..WHERE 仅适用于数据库列。您应该尝试使用 HAVING 而不是 WHERE 【参考方案1】:

为什么要走这么久...尝试使用 SELF JOIN(在查询中加入相同的表)..见下文 (未测试)

 SELECT ns.*,
        um1.meta_value AS firmName,
        um2.meta_value AS firstName,
        um3.meta_value AS lastName
 FROM nord_submission ns
 INNER JOIN nord_usermeta um1 USING(id) AND meta_key = 'firm'
 INNER JOIN nord_usermeta um2 USING(id) AND meta_key = 'first_name'
 INNER JOIN nord_usermeta um3 USING(id) AND meta_key = 'last_name'
 WHERE um1.meta_value LIKE '%DG%'
 ORDER BY ns.created_at

注意:如果两个表的列名不同,相互引用,则可以将USING(id)替换为ns.user_id=um1.user_id

【讨论】:

【参考方案2】:

如果您要使用键而不是列,则必须让应用程序对其进行排序。使用如此多的子查询,您会看到性能下降。

SELECT *
FROM nord_submissions 
 INNER JOIN nord_usermeta 
 USING (user_id)
WHERE (meta_key='last_name' or meta_key='first_name' or (meta_key='firm' and meta_value LIKE '%DG%') )
ORDER BY created_at desc

【讨论】:

这并不完全错误(当您删除 AND firm like.. 时!),但它的格式不是很好(您的会有多行,而 OP 和 diEcho 的查询每个 nord_submissions 行只有一行。无论如何,我会编辑上面提到的AND firm.. 并为您的努力和替代解决方案 +1。

以上是关于where 子句中的 MySQL 子查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql子查询在where in子句中

WHERE 子句中带有子查询的 MYSQL UPDATE 查询 - 优化

Mysql在where子句中优化子查询

MySQL中的常见子查询语句

MySQL:在 WHERE 子句中带有 NOT IN 的从属子查询非常慢

MySQL在SELECT子句中关联子查询