4

所以我有一张装满汽车的桌子:

假设有 4 条道奇毒蛇,数据库中将有 4 个条目,除了 carID 之外,所有条目都相同。

   carID | carname | carmodel | colour   |  reg
--------------------------------------------------
    1    |  viper  |  dodge  |   red     |  123
    2    |  viper  |  dodge  |   red     |  124
    3    |  viper  |  dodge  |   red     |  125
    4    |  viper  |  dodge  |   red     |  126
    5    |   R8    |  audi   |   blue    |  127
    6    |   R8    |  audi   |   blue    |  128

当用户搜索汽车时,我只想显示一条道奇毒蛇。但是,我想从该行以及其他所有不同的汽车中提取所有信息。

所以我想要的输出是:

   carID | carname | carmodel | colour  |  reg
--------------------------------------------------
     1   |  viper  |   dodge  |  red    |  123
     5   |   R8    |   audi   |  blue   |  127

如果我做:

SELECT DISTINCT * FROM cars

它拉回所有条目。

SELECT DISTINCT carname FROM cars

只拉回一个,但我只有车名。

有没有这样的:

SELECT * FROM cars ORDER BY DISTINCT carname

或者类似的东西?

4

3 回答 3

3

没看懂,是分组吗?

SELECT MAX(CarId) as carId, carname, carmodel, colour FROM cars GROUP BY carname, carmodel, colour;
于 2013-02-26T11:35:41.093 回答
3

如果你想返回 he carId,那么你可以使用以下命令返回min(carid)每个相同的carname,等等:

select min(carId) as carId, carname, carmodel, colour
from cars
group by carname, carmodel, colour

请参阅带有演示的 SQL Fiddle

你会看到我把它放在carId一个聚合函数中,这是为了确保 MySQL 总是返回carId列的预期值。当您不这样做GROUP BY或聚合 SELECT 列表中的项目时,您可能会返回意外的结果。(参见MySQL 扩展GROUP BY

来自 MySQL 文档:

MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。...您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加 ORDER BY 子句的影响。在选择了值之后对结果集进行排序,并且 ORDER BY 不会影响服务器选择的值。

于 2013-02-26T11:36:11.517 回答
1

试试这个:

SELECT DISTINCT carname, otherCol1, otherCol2... FROM cars

SQLFiddle 这里

当您编辑问题并希望显示您的 car_id 时,上述解决方案并不好。干得好:

SELECT MIN(carId) AS carId, carname, carmodel, colour
FROM cars
GROUP BY carname, carmodel, colour

MIN 或 MAX SUM 无论你使用什么都只是一个投影......你可以说的感知

于 2013-02-26T11:29:45.027 回答