MySQL - 每个GROUP BY返回X个结果

3

在这个查询中,我指定我想要返回哪些车型(硬编码)。因此,下面的SQL语句将为每个车型返回一条记录:

SELECT
        *
    FROM
        main
    WHERE
        (
            (marka_name = 'SUBARU' AND model_name = 'IMPREZA' AND (kuzov = 'GC8' OR kuzov = 'GF8')) OR
            (marka_name = 'MAZDA' AND model_name = 'RX-7' AND kuzov = 'FD3S') OR
            (marka_name = 'MITSUBISHI' AND model_name = 'LANCER' AND (kuzov = 'CN9A' OR kuzov = 'CP9A')) OR
            (marka_name = 'NISSAN' AND model_name = 'SKYLINE' AND (kuzov = 'ER34' OR kuzov = 'BCNR33')) OR
            (marka_name = 'NISSAN' AND model_name = 'SILVIA' AND kuzov = 'S14') OR
            (marka_name = 'TOYOTA' AND model_name = 'CELICA' AND kuzov = 'ST205') OR
            (marka_name = 'TOYOTA' AND model_name = 'ARISTO' AND kuzov = 'JZS161') OR
            (marka_name = 'MITSUBISHI' AND model_name = 'DELICA' AND (kuzov = 'PE8W' OR kuzov = 'PD8W' OR kuzov = 'PF8W'))
        )
        AND
        (rate != 'RA' AND rate != 'RR' AND rate != 'A1' AND rate != 'A' AND rate != 'R' AND rate >= '3')
        AND
        (mileage >= 0 AND mileage <= 150000)
        AND
        (year >= 1990 AND year <= 1998)
    GROUP BY
        model_name
    ORDER BY
        mileage ASC,
        rate DESC

现在的问题是,在没有使用联合操作的情况下,如何通过某个字段返回多个指定模型。例如:

GROUP BY
    model_name
HAVING COUNT(model_name) = 2
ORDER BY
    mileage ASC,
    rate DESC

我知道使用HAVING COUNT并没有意义,但是我需要一种方法来指定每个型号要返回多少辆汽车。 http://sqlfiddle.com/#!2/421e4/1/0

如果有3辆丰田汽车,你需要展示哪两辆车? - Devart
为了方便起见,忽略当前的WHERE约束条件(费率/里程/年份),它将返回里程最低、费率最高的丰田车。 - user2639545
1个回答

2
尝试像下面这样为每个组生成行号,然后限制行号。下面我将显示每个组的2个结果。
   Select
    `marka_name`, `model_name`, `kuzov`, `mileage`, `year`, `rate`from
    (

    SELECT
     @row_num := IF(@prev_value=main.Model_Name,@row_num+1,1) AS RowNumber,
                main.*,
    @prev_value := main.Model_Name
            FROM
                main,
      (SELECT @row_num := 1) x,
          (SELECT @prev_value := '') y
            WHERE
                (
                    (marka_name = 'SUBARU' AND model_name = 'IMPREZA' AND (kuzov = 'GC8' OR kuzov = 'GF8')) OR
                    (marka_name = 'MAZDA' AND model_name = 'RX-7' AND kuzov = 'FD3S') OR
                    (marka_name = 'MITSUBISHI' AND model_name = 'LANCER' AND (kuzov = 'CN9A' OR kuzov = 'CP9A')) OR
                    (marka_name = 'NISSAN' AND model_name = 'SKYLINE' AND (kuzov = 'ER34' OR kuzov = 'BCNR33')) OR
                    (marka_name = 'NISSAN' AND model_name = 'SILVIA' AND kuzov = 'S14') OR
                    (marka_name = 'TOYOTA' AND model_name = 'CELICA' AND kuzov = 'ST205') OR
                    (marka_name = 'TOYOTA' AND model_name = 'ARISTO' AND kuzov = 'JZS161') OR
                    (marka_name = 'MITSUBISHI' AND model_name = 'DELICA' AND (kuzov = 'PE8W' OR kuzov = 'PD8W' OR kuzov = 'PF8W'))
                )
                AND
                (rate != 'RA' AND rate != 'RR' AND rate != 'A1' AND rate != 'A' AND rate != 'R' AND rate >= '3')
                AND
                (mileage >= 0 AND mileage <= 150000)
                AND
                (year >= 1990 AND year <= 1998)
            ORDER BY
                model_name,
                mileage ASC,
                rate DESC) A where A.RowNumber<=2

要想每组获取超过2条记录,只需更改最后的where子句,例如如果您想要每组10个结果,则写成where A.RowNumber<=10。 Sql Fiddle演示

@user2639545,这是关于生成行号的问题,也就是每个组中有多少元素,生成后你可以根据自己的需要进行限制。 - Amit Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接