Mysql有趣的查询

时间:2011-11-28 13:34:40

标签: mysql

我有下一张桌子:

+---------+------------+
| 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”提出了非常有趣的方式,我一直在寻找。

3 个答案:

答案 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