我有一个查询,使用LEFT JOINS从几个表中选择数据。问题是数据正在重复。
这是查询
SELECT
A.ID,
T.T_ID,
T.name,
T.pic,
T.timestamp AS T_ts,
(SELECT COUNT(*) FROM track_plays WHERE T_ID = T.T_ID) AS plays,
(SELECT COUNT(*) FROM track_downloads WHERE T.T_ID) AS downloads,
S.S_ID,
S.status,
S.timestamp AS S_ts,
G.G_ID,
G.gig_name,
G.date_time,
G.lineup,
G.price,
G.currency,
G.pic AS G_pic,
G.ticket,
G.venue,
G.timestamp AS G_ts
FROM artists A
LEFT JOIN TRACKS T
ON T.ID = A.ID
LEFT JOIN STATUS S
ON S.ID = A.ID
LEFT JOIN GIGS G
ON G.ID = A.ID
WHERE A.ID = '$ID'
ORDER BY S_ts, G_ts AND T_ts DESC LIMIT 20
问题是如果连接中的一个表具有的数据多于另一个表,则数据会重复。因此,如果曲目有1行,状态为2而演出没有行,则会使曲目中的数据翻倍。
我尝试过使用GROUP BY A.ID
,但这会消除数据。因此,在之前给出的示例中,只有一行status
显示。
我也试过了GROUP_CONCAT
,但我对这个功能不确定,所以不能告诉你太多。
使用SELECT DISTINCT
与GROUP BY A.ID
具有相同的效果。
答案 0 :(得分:1)
假设艺术家 - >演出和艺术家 - >轨道是1-N映射,那么你有两个选择。 (这些都在你的OP的评论中有所涉及
1)指定要返回的N行中的哪一行以实现1-1地图:
FROM artists A
LEFT JOIN TRACKS T ON T.ID = A.ID AND T.<SOMETHING> = SOMETHING
LEFT JOIN STATUS S ON S.ID = A.ID
LEFT JOIN GIGS G ON G.ID = A.ID AND G.<SOMETHING> = SOMETHNING
2)在你写的时加入连接并获得曲目和演出的多个条目,然后在你的调用应用程序中转动它们。通常,您会在查询中放置一个ORDER BY子句,并检查相同的艺术家键并转动列表。