我有以下SQL代码:
SELECT m.email
FROM members as m
WHERE exists
(
select *
from posts as p
where p.email = m.email
)
order by ads desc
我想在"exists"之前添加另一个语句,这样我就有了像
这样的东西SELECT m.email
FROM members as m
WHERE
(m.ads<>0)
and
exists
(
select *
from posts as p
where p.email = m.email
)
order by ads desc
但它不起作用,以及ads<>'0'
, ads<>('0')
, m.ads<>0
等
为什么你认为它不起作用?
通过"不工作",我的意思是当我添加一行'ads<>0'时,查询结果没有变化(好像我没有输入这一行)。如果我添加一行'ads=0',它会给出空结果,就好像没有值为0的字段(实际上确实存在)
您应该能够在您的WHERE
语句中添加尽可能多的逻辑子句。
假设members.ads
是一个整数数据类型…
SELECT m.email
FROM members m
WHERE m.ads <> 0
AND EXISTS (
SELECT 1
FROM posts p
WHERE p.email = m.email
)
ORDER BY m.ads DESC
您应该能够使用EXISTS。当然,你也可以把它写成一个连接:
SELECT DISTINCT m.email
FROM members AS m
JOIN posts AS p ON p.email = m.email
WHERE (m.ads<>0)
ORDER BY ads DESC
或者,您可以决定使用子查询下推'DISTINCT'操作:
SELECT m.email
FROM members AS m
JOIN (SELECT DISTINCT p.email FROM posts AS p) AS q ON q.email = m.email
WHERE (m.ads<>0)
ORDER BY ads DESC
member表中每个email地址最多只能有一个结果;如果您允许多个成员共享一个电子邮件地址,您可能仍然需要在外部查询上使用DISTINCT。
但是,为了重申开头的观点,您应该能够像前面所示的那样,对其他子句使用EXISTS操作符。