1

我有一个使用 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 并且 gigs 没有行,您将从轨道中获得的数据加倍。

我尝试过使用GROUP BY A.ID,但这会消除数据。因此,在前面给出的示例中,只有一行status显示。

我也尝试过GROUP_CONCAT,但不确定该功能,所以不能告诉你太多。

USINGSELECT DISTINCTGROUP BY A.ID.

4

1 回答 1

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 子句并检查相同的艺术家键并旋转列表。

于 2013-06-07T20:37:16.620 回答