从子查询SQL返回所有行?

时间:2014-10-27 10:30:19

标签: mysql sql

现在我编写了查询SQL以获取受第一个查询限制的行:

SELECT * FROM commenttoarticle a 
WHERE a.idCommentToArticle = (SELECT CommentToArticlePID FROM commenttoarticle b) 
ORDER BY a.idCommentToArticle DESC LIMIT 3 

当我尝试执行此查询时,我得到:

#1242 - Subquery returns more than 1 row 

如何解决此问题?所以,我需要从子查询中获取所有行。

如果我想要返回一行 - 我需要使用GROUP BY,但这不是解决方案

修改后的查询:

    SELECT a.idCommentToArticle FROM 
commenttoarticle a WHERE a.CommentToArticlePID IN 
(SELECT idCommentToArticle FROM commenttoarticle b) ORDER BY a.idCommentToArticle DESC LIMIT 3

转储表 commenttoarticle

CREATE TABLE IF NOT EXISTS `commenttoarticle` (
  `idCommentToArticle` int(11) NOT NULL AUTO_INCREMENT,
  `CommentToArticleTime` int(11) NOT NULL,
  `CommentToArticleIdArticle` int(11) NOT NULL,
  `CommentToArticleComment` text NOT NULL,
  `CommentToArticleIdUser` int(11) NOT NULL,
  `CommentToArticlePID` int(11) NOT NULL,
  PRIMARY KEY (`idCommentToArticle`),
  UNIQUE KEY `idCommentToArticle_UNIQUE` (`idCommentToArticle`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=59 ;

--
-- Дамп данных таблицы `commenttoarticle`
--

INSERT INTO `commenttoarticle` (`idCommentToArticle`, `CommentToArticleTime`, `CommentToArticleIdArticle`, `CommentToArticleComment`, `CommentToArticleIdUser`, `CommentToArticlePID`) VALUES
(29, 0, 11, 'продажам?\nИнтересует не мега-звезда, а именно предметный, руками умеющий продавать сам и помогающий выстраивать это бизнесам.', 459, 0),
(30, 0, 11, '2', 459, 0),
(31, 0, 11, '3', 459, 0),
(36, 0, 11, '3.1', 459, 31),
(37, 1413822798, 11, 'also facing that prob. on the plteform of win 7', 459, 29),
(38, 0, 11, ' here i dont have internet connection.. @Samint Sinha thanks ill check it out maybe tomorrow.', 459, 29),
(39, 0, 11, ' Select max id and you will have dhe last row returned', 459, 29),
(32, 0, 11, '4', 459, 0),
(44, 1414354324, 11, 'How to do', 456, 29),
(45, 1414354469, 11, 'sfsfsf', 456, 29),
(46, 1414354708, 11, 'dddd', 456, 29),
(47, 1414357761, 11, 'sfsfs', 456, 0),
(57, 1414370833, 39, 'kkkppppppp', 456, 0),
(49, 1414358233, 11, 'VSF\nSFSF', 456, 0),
(50, 1414359589, 11, 'How to do', 456, 0),
(51, 1414359660, 11, 'sfsfsdf', 456, 0),
(52, 1414361057, 11, 'SDFSF', 456, 0),
(53, 1414364023, 11, 'dsfdsjfsifmsi', 456, 0),
(54, 1414364031, 11, 'sdfdskjfnskf', 456, 52),
(55, 1414364034, 11, 'sdfdskjfnskf', 456, 52),
(56, 1414364044, 11, 'fndsdfnsofosfi', 456, 52),
(58, 1414370841, 39, 'dfgdfgdgdgdgdgdfgdgdfg', 456, 0);

得到我需要的东西:

以下是sqlfiddle的示例:sqlfiddle.com/#!2/dbd82a/1我需要为每个第一个查询获取最后3行且无限COMMENTTOARTICLEPID(如果存在)。例如,我需要获取IDCOMMENTTOARTICLE: 58, 57, 56, 52

的行

6 个答案:

答案 0 :(得分:2)

SELECT a.* 
  FROM commenttoarticle a 
  JOIN commenttoarticle b
    ON b.CommentToArticlePID = a.idCommentToArticle 
 ORDER  
    BY a.idCommentToArticle DESC 
 LIMIT 3 

答案 1 :(得分:1)

使用IN而不是' ='在分选之前。

答案 2 :(得分:1)

在中使用而不是 ==

SELECT * FROM commenttoarticle a WHERE a.idCommentToArticle in (SELECT CommentToArticlePID FROM commenttoarticle b) ORDER BY a.idCommentToArticle DESC LIMIT 3 

答案 3 :(得分:1)

使用IN代替=,因为您的查询会返回大量值:

SELECT * FROM commenttoarticle a 
WHERE a.idCommentToArticle IN (
    SELECT CommentToArticlePID 
    FROM commenttoarticle b) 
ORDER BY a.idCommentToArticle DESC LIMIT 3 

答案 4 :(得分:1)

您可以在子查询或主查询中使用限制,也可以同时使用两者。 如果您只需要3个结果,那么在主查询中添加限制

SELECT * FROM commenttoarticle a WHERE a.idCommentToArticle IN (SELECT CommentToArticlePID FROM commenttoarticle b) ORDER BY a.idCommentToArticle DESC LIMIT 3 

如果您想在子查询中获得3个结果,那么它将是这样的

SELECT * FROM commenttoarticle a WHERE a.idCommentToArticle IN (SELECT CommentToArticlePID FROM commenttoarticle b LIMIT 3) ORDER BY a.idCommentToArticle DESC

如果你想要两个

SELECT * FROM commenttoarticle a WHERE a.idCommentToArticle IN (SELECT CommentToArticlePID FROM commenttoarticle b LIMIT 3) ORDER BY a.idCommentToArticle DESC LIMIT 3 

答案 5 :(得分:0)

我认为你的子查询返回超过1行,因此将“=”替换为“IN”。像这样......

SELECT * FROM commenttoarticle a 
WHERE a.idCommentToArticle IN (SELECT CommentToArticlePID FROM commenttoarticle b) 
ORDER BY a.idCommentToArticle DESC LIMIT 3