MySQL子查询返回多于一行
我不明白为什么这不起作用。基本上,我正在运行一个子查询来计算p.songid WHERE trackDeleted=0
的所有行。当我自己执行它时,子查询工作正常,但是当我实现时,我得到“子查询返回多于一行”。MySQL子查询返回多于一行
SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, s.timeSubmitted, s.userid, s.insWanted, s.bounty,
(SELECT COUNT(p.songid)
FROM songs s
LEFT JOIN users u
ON u.id = s.userid
LEFT JOIN posttracks p
ON s.songid = p.songid
WHERE p.trackDeleted=0
GROUP BY s.timeSubmitted ASC
LIMIT 25)
AS trackCount
FROM songs s
LEFT JOIN users u
ON u.id = s.userid
LEFT JOIN posttracks p
ON s.songid = p.songid
WHERE paid=1 AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY)
GROUP BY s.timeSubmitted ASC
LIMIT 25
显然,子查询不能返回多于一行,因为这没有意义。您只希望返回一个值 - COUNT(p.songid)
- 但您GROUP BY s.timeSubmitted,这将使其返回多行,并且多个计数p.songid
。
想想这样,SELECT语句中的子查询就像你有需要返回一个值,因为它将像你选择列表中的另一列那样行事。由于你的身上有一个LIMIT 25
,你显然希望有一个以上的价值回来,这对这种用法是正确的。
我本质上是试图创建一个新的列与轨道数所有轨道WHERE deletedTrack = 0。我还会怎么做呢? – user978905
好的,你的查询是一团糟。子查询不仅被破坏,而且我很确定GROUP BY s.timeSubmitted ASC
没有按照您认为的那样做。 (你的意思是ORDER BY
?)如果你用文字解释你想完成什么,它可能会有所帮助。
无论如何,我要带胡乱猜测,并认为这可能是你想要的东西:
SELECT
u.username, u.id, u.score, s.genre, s.songid, s.songTitle,
s.timeSubmitted, s.userid, s.insWanted, s.bounty,
COUNT(p.songid) AS trackCount
FROM songs s
LEFT JOIN users u ON u.id = s.userid
LEFT JOIN posttracks p ON p.songid = s.songid AND p.trackDeleted = 0
WHERE paid = 1 AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY)
GROUP BY s.songid
ORDER BY s.timeSubmitted ASC
LIMIT 25
编辑:修正了COUNT()
,这样它会正确地返回0,如果没有匹配轨道。
我基本上试图创建一个新的列与轨道数所有轨道WHERE deletedTrack = 0。我还会怎么做呢? – user978905
只需从子查询中删除GROUP BY和LIMIT子句 –
如果我这样做,它会为每一行返回相同的值。我需要它能够返回每个songid的tracksDeleted = 0的行数。 – user978905