MySQL技术问询:查询同表同ID的其他行及多表关联问题
MySQL 查询与表关联操作解决方案
我来帮你解决这两个MySQL相关的问题,都是日常开发里很常见的场景:
1. 同一张表中查询所有具有相同ID的其他行
这里分两种常见场景来处理:
场景1:已知特定ID,查询该ID对应的所有行
如果已经知道要找的ID值,直接用WHERE条件过滤就行,非常直观:
-- 把your_table换成你的实际表名,34换成目标ID SELECT * FROM your_table WHERE ID = 34;
场景2:找出所有存在重复ID的行(即ID出现多次的所有记录)
要是你想找出表中所有ID不止出现一次的行,可以用两种方法实现:
方法一:使用GROUP BY + 子查询
先通过分组找出重复的ID,再关联原表获取完整记录:
SELECT t.* FROM your_table t JOIN ( -- 先筛选出出现次数大于1的ID SELECT ID FROM your_table GROUP BY ID HAVING COUNT(*) > 1 ) dup_ids ON t.ID = dup_ids.ID;
方法二:使用窗口函数(MySQL 8.0及以上版本支持)
窗口函数写法更简洁,适合新版本MySQL:
SELECT * FROM ( -- 给每个ID分组统计出现次数 SELECT *, COUNT(*) OVER (PARTITION BY ID) AS id_occurrences FROM your_table ) t -- 只保留出现次数大于1的记录 WHERE t.id_occurrences > 1;
2. Songs表与关联表的常见操作
先明确你提供的Songs表结构和数据:
| Title | ID | Version |
|---|---|---|
| songnumber1 | 34 | original |
| songnumber2 | 35 | remix |
| songnumber3 | 36 | remix |
假设关联表是SongAssociations(用于记录歌曲间的关联关系,比如原版和remix的对应),常见结构如下:
| song_id | associated_song_id | relation_type |
|---|---|---|
| 34 | 35 | remix_of |
| 35 | 34 | original_of |
下面是几种高频的关联操作:
关联查询:获取关联歌曲的详细信息
比如想查询所有remix歌曲对应的原版歌曲名称:
SELECT s.Title AS remix_song, s_assoc.Title AS original_song FROM Songs s JOIN SongAssociations sa ON s.ID = sa.song_id JOIN Songs s_assoc ON sa.associated_song_id = s_assoc.ID WHERE sa.relation_type = 'remix_of';
执行后会返回remix歌曲和它对应的原版歌曲的对应关系。
插入关联关系:添加歌曲间的关联记录
比如给songnumber2(ID35)和songnumber1(ID34)添加双向关联:
INSERT INTO SongAssociations (song_id, associated_song_id, relation_type) VALUES (35, 34, 'remix_of'), (34, 35, 'original_of');
双向关联能让后续查询更灵活,不管从原版还是remix出发都能找到对应歌曲。
删除关联关系:移除指定歌曲间的关联
如果要删除ID35和ID34之间的所有关联记录:
DELETE FROM SongAssociations WHERE (song_id = 35 AND associated_song_id = 34) OR (song_id = 34 AND associated_song_id = 35);
内容的提问来源于stack exchange,提问作者user9675479
相关产品推荐
相关产品推荐

