我有下一张桌子:
+---------+------------+
| firm_id | service_id |
+---------+------------+
| 6 | 2 |
| 6 | 4 |
| 23 | 7 |
| 23 | 6 |
我希望只有不的公司才能在服务列表中使用service_id = 4。
上表的查询应仅返回firm_id = 23的公司,因为firm_id = 6有一条service_id = 4的记录。
我想用一个查询来创建它。这可能(没有连接)吗?
感谢。
P.S。感谢大家。用户“derobert”提出了非常有趣的方式,我一直在寻找。
答案 0 :(得分:5)
您可以通过多种方式完成此操作。这是一个,带有相关的子查询:
SELECT DISTINCT firm_id FROM table t1
WHERE NOT EXISTS ( SELECT 1 FROM table t2 WHERE t1.firm_id = t2.firm_id AND t2.service_id = 4)
在MySQL-land中,通常最好将其重写为自联接:
SELECT DISTINCT firm_id
FROM table t1 LEFT JOIN table t2 ON (t1.firm_id = t2.firm_id AND t2.service_id = 4)
WHERE t2.firm_id IS NULL
最后,这是一种不涉及子查询或连接的方法(但我希望表现比上述任何一种都差)
SELECT firm_id, CONCAT(',', GROUP_CONCAT(service_id SEPARATOR ','), ',') AS service_ids
FROM table t1
GROUP BY firm_id
HAVING service_ids NOT LIKE '%,4,%'
我承认我实际上并没有这些;请原谅错别字。
答案 1 :(得分:3)
SELECT DISTINCT
firm_id
FROM
TableX AS t
WHERE
NOT EXISTS
( SELECT
*
FROM
TableX AS s
WHERE
s.firm_id = t.firm_id
AND
s.service_id = 4
)
或:
SELECT
firm_id
FROM
TableX
GROUP BY
firm_id
HAVING
COUNT(service_id = 4) = 0
答案 2 :(得分:1)
你可以尝试
SELECT * FROM your_table
WHERE firm_id NOT IN
(SELECT DISTINCT firm_id FROM your_table
WHERE service_id = 4) a
根据ypercube的建议(谢谢!),您也可以尝试
SELECT DISTINCT firm_id, service_id FROM your_table
WHERE firm_id NOT IN
(SELECT firm_id FROM your_table
WHERE service_id = 4) a