我有一个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子句中引用它的方法 请帮忙。
答案 0 :(得分:3)
为什么这么长...尝试使用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
等等上
答案 1 :(得分:1)
如果您要使用密钥而不是列,则必须让应用程序对其进行排序。使用如此多的子查询,您将看到性能损失。
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