在一个查询中,这个SQL查询如何更清晰,更好?

时间:2014-10-21 06:21:59

标签: mysql sql limit distinct greatest-n-per-group

我有这样的事情:

SELECT cars.brand, cars.id FROM cars WHERE cars.brand = 4 LIMIT 1;
SELECT cars.brand, cars.id FROM cars WHERE cars.brand = 24 LIMIT 1;
SELECT cars.brand, cars.id FROM cars WHERE cars.brand = 29 LIMIT 1;

如果会有更多查询,那将会很长。 如何以另一种方式,在一条线上?但重要的是我的速度。 cars.brand = X AND LIMIT X是一个变量,所以它可能会改变。

5 个答案:

答案 0 :(得分:1)

    $ids = (4, 24, 29);
    $limit = 1;

foreach ($ids as $id){
    $query = "SELECT cars.brand, cars.id FROM cars WHERE cars.brand = $id LIMIT $limit";
    // perform query
    // store result
}

答案 1 :(得分:1)

您担心必须逐个发送这么多查询,这样会耗费大量时间。您可以改为执行此查询:

SELECT cars.brand, cars.id FROM cars WHERE cars.brand = 4 LIMIT 1
UNION ALL
SELECT cars.brand, cars.id FROM cars WHERE cars.brand = 24 LIMIT 1
UNION ALL
SELECT cars.brand, cars.id FROM cars WHERE cars.brand = 29 LIMIT 1;

答案 2 :(得分:0)

SELECT cars.brand, cars.id FROM cars WHERE cars.brand IN(4, 24, 29) LIMIT 1;

答案 3 :(得分:0)

方法1:

SELECT cars.brand, cars.id 
       FROM cars 
       WHERE cars.brand = 4 OR cars.brand = 24 OR cars.brand = 29
       LIMIT 1;

方法2:

SELECT cars.brand, cars.id 
      FROM cars 
      WHERE cars.brand IN(4, 24, 29)
      LIMIT 1;

答案 4 :(得分:0)

因为您似乎并不关心每个品牌返回哪个车牌,只要每个品牌只有一个,然后只需使用MAX或MIN来选择按品牌分类的ID: -

SELECT cars.brand, MAX(cars.id) AS id
FROM cars 
WHERE cars.brand IN(4, 24, 29) 
GROUP BY cars.brand;

这应该很快(假设你有有用的索引)。

如果您想要不同数量的限量汽车,那么您可以对它们进行排序并使用变量为每个限定车辆分配一个数字,然后摆脱数字高于该数字的数字。例如,将其限制为每个3: -

SELECT sub0.brand, sub0.id, @ctr := IF(@brand = sub0.brand, @ctr:=@ctr+1, 1) AS brand_ctr, @brand := sub0.brand
FROM
(
    SELECT cars.brand, cars.id
    FROM cars 
    WHERE cars.brand IN(4, 24, 29) 
    ORDER BY cars.brand
) sub0
CROSS JOIN (SELECT @ctr := 1, @brand := 0) sub1
HAVING brand_ctr <= 3

根据品牌的数量,这不是非常有效,但是很容易创建为动态SQL(您只需要IN子句中的ID来设置SQL,而不是构建大量的UNIONed语句)。