2015-10-10 2 views
0

Я хочу получить значения из 3 таблицы, где я получаю ошибку «Sub query возвращает более 1 строки».MySql throws error Подзапрос возвращает более 1 строки

Мое понятие состоит в том, чтобы получить все сообщение, в котором я должен рассчитать сумму голосов от таблицы ttpostvotes относительно каждого сообщения, и если при условии, что userid проголосовали за эту должность, тогда будет показано количество сообщений, например 1 или - 1.

Мой запрос, как показано ниже:

SELECT r.PostId, r.`Post`,r.PostTime, coalesce(x.Votes, 0) as Votes , 
(Select Votes From `ttpostvotes` where UserId=30 and x.PostId=r.PostId) as IsUservoted, 
(Select Count(*) From ttreply where PostId=r.PostId) AS ReplyCount FROM `ttpost` r 
left join (SELECT PostId, sum(Votes) as Votes FROM `ttpostvotes` GROUP BY PostId) x ON 
x.PostId = r.PostId WHERE r.OffensiveCount<3 and r.SpamCount<5 and r.OtherCount<7 and r.`PeekId`=101 ORDER BY `r`.`PostTime` DESC 

В 3 таблицы похожи, как показано ниже: ttpost

ttpost table structure

ttpostvotes

ttpostvotes

ttreply

ttreply

ответ

1

Это ваш select:

SELECT r.PostId, r.`Post`,r.PostTime, coalesce(x.Votes, 0) as Votes, 
     (Select Votes From `ttpostvotes` where UserId = 30 and x.PostId = r.PostId 
     ) as IsUservoted, 
     (Select Count(*) From ttreply where PostId=r.PostId) AS ReplyCount 

Первый подзапрос не имеет агрегации, так что я полагаю, пользователь может голосовать более одного раза за пост. Это исправит синтаксическую ошибку:

SELECT r.PostId, r.`Post`,r.PostTime, coalesce(x.Votes, 0) as Votes, 
     (Select SUM(Votes) From `ttpostvotes` where UserId = 30 and x.PostId = r.PostId 
     ) as IsUservoted, 
     (Select Count(*) From ttreply where PostId = r.PostId) AS ReplyCount 

Независимо от того, что вы делаете, это другой вопрос.

Примечание: если вы хотите, чтобы ваш исходный запрос на работу, вы должны определить уникальный ограничение/индекс на ttpostvotes:

create unique index unq_ttpostvotes_userid_postid on ttpostvotes(userid, postid); 
Смежные вопросы