【发布时间】:2017-11-24 14:05:32
【问题描述】:
我对数据库不太感兴趣,我有以下疑问与我在 MySql 数据库上运行的查询有关。
我有这个问题:
SELECT
CD.id AS id,
CD.commodity_name_en AS commodity_name_en
FROM MarketDetails AS MD
INNER JOIN MarketDetails_CommodityDetails AS MD_CD
ON MD.id = MD_CD.market_details_id
INNER JOIN CommodityDetails AS CD
on MD_CD.commodity_details_id = CD.id
WHERE MD.localization_id = 1
返回类似这样的内容(代表某些市场的商品列表):
id commodity_name_en
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 Rice-Asia
2 Apple banana
3 Avocado
4 Red onion
5 White onion
6 Green Beans
7 Bell pepper
8 Carrot
9 Tomatoes
10 Irish potatoes
11 Maize
1 Rice-Asia
3 Avocado
5 White onion
8 Carrot
11 Maize
2 Apple banana
7 Bell pepper
9 Tomatoes
10 Irish potatoes
1 Rice-Asia
如您所见,这些商品可以出现多次(因为特定商品可以在多个市场上销售)。
我想更改我的查询,使每个商品只出现一次(因为最后我想要所有可能商品的列表而不重复)。
所以我知道我可以这样做:
SELECT
CD.id AS id,
CD.commodity_name_en AS commodity_name_en
FROM MarketDetails AS MD
INNER JOIN MarketDetails_CommodityDetails AS MD_CD
ON MD.id = MD_CD.market_details_id
INNER JOIN CommodityDetails AS CD
on MD_CD.commodity_details_id = CD.id
WHERE MD.localization_id = 1
GROUP BY id
我按 ID 分组,但我也可以按名称分组(相同)。
我的疑问是:我可以使用 distinct 语句来获得相同的行为吗?
在这里阅读似乎可以解决问题:https://www.tutorialspoint.com/sql/sql-distinct-keyword.htm
所以我也尝试了这个解决方案,它似乎返回了相同的结果
SELECT DISTINCT
CD.id AS id,
CD.commodity_name_en AS commodity_name_en
FROM MarketDetails AS MD
INNER JOIN MarketDetails_CommodityDetails AS MD_CD
ON MD.id = MD_CD.market_details_id
INNER JOIN CommodityDetails AS CD
on MD_CD.commodity_details_id = CD.id
WHERE MD.localization_id = 1
那么 DISTINCT 和 GROUP BY 解决方案之间的确切区别是什么?在我这种情况下,最聪明的是什么?
谢谢
【问题讨论】:
-
我建议对每个查询运行 EXPLAIN 并发布结果,这将突出每种方法的效率
-
根据@PaulDixon 的评论,我还将对每个时间进行基准测试。
-
DISTINCT查询通常可以通过GROUP BY在 MySQL 的底层实现。我不希望这两个查询的执行方式有太大差异。 -
DISTINCT和GROUP BY可以做同样的事情,但它们有不同的用途。因此,请相应地使用它们,以使您的查询尽可能具有可读性。当您有重复的行并想要删除重复的行时,请使用DISTINCT。这很少需要。大多数情况下DISTINCT表示您不必要地创建了重复项,就像您的情况一样。仅当您想要聚合行时才使用GROUP BY,例如获取总和、最大值或计数。
标签: mysql sql database group-by distinct