需要帮助MYSQL查询返回常见行

时间:2014-10-18 19:57:27

标签: mysql sql

我有一个示例表:

Year, Make, Model
1991 Honda Accord
1992 Honda Accord
1993 Honda Accord
1993 Ford Explorer

如果我想从1992-1993获得生产中的所有制造,返回的行应该是"本田",因为福特(在我的例子中)只在1993年生产了一辆汽车,但没有一个在1992年。

我可以使用有关查询的任何想法吗?

编辑:

使用下面答案中的查询来使用IN语句,确实有效,但是当我执行25个IN语句时,花费的时间太长而且超时。

我从1990年开始测试它,然后是1990年1991年1992年等等......当它到达2000年左右时需要太长时间并且超时。我确实可以选择只做两年(开始年份和结束年份),但我担心这不会那么准确,因为制造商可能会在开始年份参数,甚至是年终参数中都有汽车产品,但是不会在介于两者之间的某个地方生产汽车,更糟糕的是,当我开始使用模型代替品牌时,我绝对需要检查所有年份。

表格定义

CREATE TABLE Cars
( year INT,
  Make VARCHAR(20),
  Model VARCHAR(20)
 );

表格数据

INSERT INTO Cars
SELECT 1991, 'Alfo', 'Rom'
UNION
SELECT 1992, 'Alfo', 'Rom'
UNION
SELECT 1993, 'Alfa', 'Rom'
UNION
SELECT 1994, 'Alfa', 'Rom'
UNION
SELECT 1992, 'Honda', 'Accord'
UNION
SELECT 1993, 'Honda', 'Accord'
UNION
SELECT 1994, 'Honda', 'Del Sol'
UNION
SELECT 1993, 'Acura', 'Integra'
UNION
SELECT 1994, 'Acura', 'TL'
UNION
SELECT 1993, 'Ford', 'Explorer'
UNION
SELECT 1994, 'Honda', 'Accord';

SQL Fiddle

2 个答案:

答案 0 :(得分:1)

有几个in运营商可以解决这个问题:

SELECT make
FROM   my_table
WHERE  make IN (SELECT make 
                FROM   my_table
                WHERE  year = 1992) AND
       make IN (SELECT make 
                FROM   my_table
                WHERE  year = 1993)

答案 1 :(得分:1)

  

我从1990年开始测试它,然后1990年1991年1992年等等...   当它到达2000左右时,它需要太长时间并且超时。我有   只做了两年(开始年和结束年)的选择,但我   担心不会那么准确,因为制造商可能有产品   汽车在开始年份参数,甚至是年终参数,   但是没有在两者之间的某个地方生产汽车,更糟糕的是什么时候   我开始用模特代替制作,我绝对必须这样做   检查所有年份。

您需要使用HAVINGCOUNT

SELECT  t.Make
FROM   
    (SELECT DISTINCT c.YEAR, c.Make
    FROM cars c) t 
WHERE t.YEAR IN (1992,1993,1994)  -- all the years
GROUP BY t.make
HAVING COUNT(*) = 3 --total number of years

SQL Fiddle Demo