【问题标题】:Need help on MYSQL query returning common rows在 MYSQL 查询返回常见行时需要帮助
【发布时间】:2014-10-18 19:57:26
【问题描述】:

我有一个这样的示例表:

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

如果我想获取 1992-1993 年生产的所有品牌,则返回的行应该是“本田”,因为福特(在我的示例中)在 1993 年只生产了一辆汽车,但在 1992 年没有生产一辆。

对我可以使用的查询有什么想法吗?

编辑:

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

我从 1990 年 1991 年开始测试它,然后是 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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我从 1990 年 1991 年开始测试它,然后是 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

    【讨论】:

    • 嗯.. 我得到这个响应:错误代码:1054。“字段列表”中的未知列“c.Make”
    • 三个地方的表名都更新了吗?表的名称是什么?
    • 是的,我确实更新了表名。我的桌子的名字是汽车。所有3个地方。我在 Windows 上使用 MYSQL 5.6
    • 我正在根据您的comment 更新我对您问题的回答。请在问题中添加评论
    • @davidmaster 我更新了答案并为 MYSQL 5.6 添加了 SQL fiddle 检查它
    【解决方案2】:

    几个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)
    

    【讨论】:

    • 完美!你太棒了。我不知道 IN 运算符。 :D 我现在超级开心。
    • @mureninik 现在还有另一个问题。如果我做了很长的年份,比如 1990-2015,返回时间太长并且 mysql 超时。我从 1990 1991 开始测试它,然后是 1990 1991 1992 等等……当它达到 2000 左右时,它需要很长时间并且超时。我确实可以选择只做两年(年初和年末),但我担心这不会那么准确,因为制造商可能在那一年没有生产汽车。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2020-11-10
    相关资源
    最近更新 更多