【问题标题】:Return all rows from sub-query SQL?从子查询 SQL 返回所有行?
【发布时间】:2014-10-27 19:11:31
【问题描述】:

现在我编写了查询 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 获取行

【问题讨论】:

  • try (SELECT CommentToArticlePID FROM commenttoarticle b limit 1) 或者在子查询中添加一些 where 子句以便它应该返回 1 条记录或者使用 WHERE a.idCommentToArticle in(SELECT CommentToArticlePID FROM commenttoarticle b)
  • 不要使用子查询
  • 对不起,为什么不是 55、54、53?
  • 因为最新的行是58, 57, 56 并且行IDCOMMENTTOARTICLE = 56 有孩子COMMENTTOARTICLEPID = 52

标签: mysql sql


【解决方案1】:
SELECT a.* 
  FROM commenttoarticle a 
  JOIN commenttoarticle b
    ON b.CommentToArticlePID = a.idCommentToArticle 
 ORDER  
    BY a.idCommentToArticle DESC 
 LIMIT 3 

【讨论】:

  • 请相应地编辑您的问题,从提供的数据集中显示所需的输出。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    使用 in 而不是 ==

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

    【讨论】:

    • 是的,它有效,但只显示第一次查询的 3 行
    • @AllenDegrud:相应地更改您的子查询。
    【解决方案4】:

    使用IN 而不是=,因为您的查询返回很多值:

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

    【讨论】:

      【解决方案5】:

      您可以在子查询或主查询或两者中都使用限制。 如果您只需要 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 
      

      【讨论】:

      • #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        相关资源
        最近更新 更多