【发布时间】:2018-05-10 19:24:29
【问题描述】:
我有一个相当复杂的 MySQL 查询,其中包含多个 UNION 语句。我试图从最终输出中消除重复项,但并非所有列都相同(包括 ID)。所以我想在“名称”列上使用GROUP BY 来消除具有相同名称的条目。这是用于许多其他地图图层的地图混搭。一些地点标记出现在多个图层上(即餐厅可能出现在“餐厅”图层、“酒吧”图层和“家庭烹饪”图层上,每个图层都有不同的 ID)。
每个UNION SELECT 语句只生成一行包含该地点的“名称”,但到最后,在所有UNIONs 运行之后,我对同一个地点有多个条目。所以我觉得我需要在每个UNION 发生后以某种方式处理所有数据上的GROUP BY。
我将尝试用简化版本的语句来说明......
(
SELECT l.id AS lid, m.markername AS markername, m.id AS mid, m.layer AS mlayer
FROM layertable
INNER JOIN markertable
ON m.layer LIKE Concat('%"',l.id,'"%')
WHERE l.id='66'
## RESULT INCLUDES Joes Place AND Eatery
)
UNION
(
SELECT l.id AS lid, m.markername AS markername, m.id AS mid, m.layer AS mlayer
FROM layertable
INNER JOIN markertable
ON m.layer LIKE Concat('%"',l.id,'"%')
WHERE l.id='82'
## RESULT INCLUDES Joes Place AND Eatery
)
UNION
(
SELECT l.id AS lid, m.markername AS markername, m.id AS mid, m.layer AS mlayer
FROM layertable
INNER JOIN markertable
ON m.layer LIKE Concat('%"',l.id,'"%')
WHERE l.id='91'
## RESULT INCLUDES Joes Place
)
ORDER BY markername ASC
LIMIT 10
结果看起来像...
| lid | markername | mid | mlayer |
=================================================
| 66 | Joes Place | 10 | ["66","82","91"] |
| 82 | Joes Place | 10 | ["66","82","91"] |
| 91 | Joes Place | 10 | ["66","82","91"] |
| 66 | Eatery | 11 | ["66","82"] |
| 82 | Eatery | 11 | ["66","82"] |
我想要的是……
| lid | markername | mid | mlayer |
=================================================
| 91 | Joes Place | 10 | ["66","82","91"] |
| 82 | Eatery | 11 | ["66","82"] |
DISTINCT 似乎不起作用,因为记录并不完全相同。
我尝试在ORDER BY 之前和之后放置GROUP BY markername,但无论哪种方式我都会收到语法错误消息。在单个 SELECTS 中应用它并没有帮助,因为每个表都只会有一个地方实例。
所以,重申我的问题:
如何在UNION 之后将GROUP BY 应用于总列表并仅输出唯一命名的地点?
或者还有其他方法可以完成这项任务吗?
提前致谢。
【问题讨论】:
-
如果您需要 id 值,为什么要尝试丢弃除一个之外的所有值,每个都有一个 group by?如果没有,为什么要选择它们?
-
另外,你为什么使用 UNION 而
WHERE l.id IN ('66', '82', '91')会更清晰,可能更快? -
这是在地图本身下方显示地图标记的列表。我不需要该列表来显示 Joes Place 3 次。只有一个。地图本身已经消除了重复的标记,但开箱即用的列表却没有。
-
为什么不对联合结果进行查询呢?
SELECT * FROM (<union query>) GROUP BY markername -
其实不是,这是因为
lid在每一行上都是不同的。只是不要选择该字段。从每个查询中删除l.id AS lid,。如果您对它们的独特价值不感兴趣,我认为这意味着您实际上对它们根本不感兴趣。所以不要选择它们,你不会有重复的。
标签: mysql group-by distinct union