【问题标题】:MySQL: How to COUNT the number of rows returned by a Complicated QueryMySQL:如何计算复杂查询返回的行数
【发布时间】:2011-08-22 14:06:49
【问题描述】:

这感觉应该很简单,但我就是搞不定,我什么都试过了。

我如何获取此查询返回的 NUMBER OF ROWS:

(SELECT Alias1 . *, 
        Alias2 . * 
 FROM   Table1 AS Alias1 
        LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
 WHERE  Alias1.Col1 != 'blah1' 
        AND Alias1.Col2 LIKE 'blah2' 
        AND ( Alias1.Col3 LIKE 'blah3' 
               OR Alias1.Col3 LIKE 'blah4' ) 
        AND Alias1.Col4 = 'blah5' 
        AND Alias2.Col7 LIKE 'blah6' 
 ORDER  BY Alias1.Col6 DESC 
 LIMIT  50) 

UNION 

(SELECT Alias1 . *, 
        Alias2 . * 
 FROM   Table1 AS Alias1 
        LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
 WHERE  Alias1.Col1 != 'blah1' 
        AND Alias1.Col2 LIKE 'blah2' 
        AND ( Alias1.Col3 LIKE 'blah3' 
               OR Alias1.Col3 LIKE 'blah4' ) 
        AND Alias1.Col4 = 'blah5' 
        AND Alias2.Col5 LIKE 'blah6' 
 ORDER  BY Alias1.Col6 DESC 
 LIMIT  50) 

UNION 

(SELECT Alias1 . *, 
        Alias2 . * 
 FROM   Table1 AS Alias1 
        LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
 WHERE  Alias1.Col1 != 'blah1' 
        AND Alias1.Col2 LIKE 'blah2'
        AND ( Alias1.Col3 LIKE 'blah3' 
               OR Alias1.Col3 LIKE 'blah4' ) 
        AND Alias1.Col4 = 'blah5' 
 ORDER  BY Alias1.Col6 DESC 
 LIMIT  50) 

我想我可以只使用 PHP 执行查询,然后对结果执行 mysql_num_rows,但我想直接使用 SQL 执行,因为我听说这样会更快,因为它可以节省一步。

谢谢!

编辑:

以下是给我的错误(#1060 - Duplicate column name 'Col1'):

   SELECT COUNT(*) FROM (
   (SELECT Alias1 . *, 
            Alias2 . * 
     FROM   Table1 AS Alias1 
            LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
     WHERE  Alias1.Col1 != 'blah1' 
            AND Alias1.Col2 LIKE 'blah2' 
            AND ( Alias1.Col3 LIKE 'blah3' 
                   OR Alias1.Col3 LIKE 'blah4' ) 
            AND Alias1.Col4 = 'blah5' 
            AND Alias2.Col7 LIKE 'blah6' 
     ORDER  BY Alias1.Col6 DESC 
     LIMIT  50) 

    UNION 

    (SELECT Alias1 . *, 
            Alias2 . * 
     FROM   Table1 AS Alias1 
            LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
     WHERE  Alias1.Col1 != 'blah1' 
            AND Alias1.Col2 LIKE 'blah2' 
            AND ( Alias1.Col3 LIKE 'blah3' 
                   OR Alias1.Col3 LIKE 'blah4' ) 
            AND Alias1.Col4 = 'blah5' 
            AND Alias2.Col5 LIKE 'blah6' 
     ORDER  BY Alias1.Col6 DESC 
     LIMIT  50) 

    UNION 

    (SELECT Alias1 . *, 
            Alias2 . * 
     FROM   Table1 AS Alias1 
            LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
     WHERE  Alias1.Col1 != 'blah1' 
            AND Alias1.Col2 LIKE 'blah2'
            AND ( Alias1.Col3 LIKE 'blah3' 
                   OR Alias1.Col3 LIKE 'blah4' ) 
            AND Alias1.Col4 = 'blah5' 
     ORDER  BY Alias1.Col6 DESC 
     LIMIT  50)
   ) a

以下是给我的错误(#1064 - 你的 SQL 语法有错误;):

 SELECT COUNT(*) FROM (
   (SELECT Alias1 . *, 
            Alias2 . * 
     FROM   Table1 AS Alias1 
            LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
     WHERE  Alias1.Col1 != 'blah1' 
            AND Alias1.Col2 LIKE 'blah2' 
            AND ( Alias1.Col3 LIKE 'blah3' 
                   OR Alias1.Col3 LIKE 'blah4' ) 
            AND Alias1.Col4 = 'blah5' 
            AND Alias2.Col7 LIKE 'blah6' 
     ORDER  BY Alias1.Col6 DESC 
     LIMIT  50) a

    UNION 

    (SELECT Alias1 . *, 
            Alias2 . * 
     FROM   Table1 AS Alias1 
            LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
     WHERE  Alias1.Col1 != 'blah1' 
            AND Alias1.Col2 LIKE 'blah2' 
            AND ( Alias1.Col3 LIKE 'blah3' 
                   OR Alias1.Col3 LIKE 'blah4' ) 
            AND Alias1.Col4 = 'blah5' 
            AND Alias2.Col5 LIKE 'blah6' 
     ORDER  BY Alias1.Col6 DESC 
     LIMIT  50) b

    UNION 

    (SELECT Alias1 . *, 
            Alias2 . * 
     FROM   Table1 AS Alias1 
            LEFT JOIN Table2 AS Alias2 USING ( Col1 ) 
     WHERE  Alias1.Col1 != 'blah1' 
            AND Alias1.Col2 LIKE 'blah2'
            AND ( Alias1.Col3 LIKE 'blah3' 
                   OR Alias1.Col3 LIKE 'blah4' ) 
            AND Alias1.Col4 = 'blah5' 
     ORDER  BY Alias1.Col6 DESC 
     LIMIT  50) c
   ) z

【问题讨论】:

  • 为什么将整个查询包装在括号中(使其成为子查询)并对其执行 SELECT COUNT(*) 无法正常工作?它是否返回错误消息?
  • 当你将它包装在 Select Count(*) FROM(Your Long query) AS CountThis 中会发生什么。你得到一个特定的错误,还是你得到错误的计数?
  • 您没有提供不使用 mysql_num_rows() 的充分理由。它的存在是有原因的……使用它。为什么你认为它会很慢?
  • 我尝试使用Select Count(*) from query,它工作得非常好。您能否发布您确切尝试执行的内容以及使用 count 时遇到的错误?
  • @reggie:“内部子查询”是什么意思?是的,我重复了这个问题并使其更具体,因为没有人能够回答它,而一个特别的答案是得到了支持,即使它不起作用。

标签: php mysql count


【解决方案1】:

将整个查询括在括号中(使其成为子查询)并从中执行 select count(*):

select count(*) from (YOUR HUGE QUERY UNION YOUR HUGE QUERY) a

【讨论】:

  • 实际错误是:#1248 - 每个派生表都必须有自己的别名
  • 尝试在每个 UNIONED 查询之后放置一个别名。即 select count(*) from ((select ...) a union (select ...) b union (select ...) c) a
  • 另一个错误:#1064 - 您的 SQL 语法有错误;我将编辑我的帖子,以便您查看我输入的内容。
  • 请参阅我帖子中的编辑,了解我从您的建议中得到的错误。
  • 如果为表别名添加“AS a”而不是“a”,您会得到同样的错误吗?
【解决方案2】:

您需要为您的列 Col1 指定一个唯一别名,因为它在 join 中使用,这需要唯一的列相互匹配。如果遇到重复的列,它将抛出错误 1060。检查这个:Duplicate column names in SQL query

在您的情况下,MySQL 与表 1 和表 2 中的 Col1 混淆,因此出现错误。用过之后可以SELECT COUNT(*) from YourQuery

【讨论】:

  • 成功了!此外,只需删除 ', Alias2 。 * ' 来自所有 3 个 SELECTS 的效果也很好。谢谢雷吉!
【解决方案3】:

将整个查询包装为

SELECT COUNT(*) FROM (<Your query>)

【讨论】:

  • 这给了我以下错误:#1248 - 每个派生表都必须有自己的别名
【解决方案4】:

真正使用mysql_num_rows。对于联合,数据库无论如何都需要建立一个临时表,这是昂贵的事情。即使可以直接在 SQL 中执行,您也不会通过要求 MySQL 给您这个数字来节省太多。

无论如何,只要使用mysql_num_rows 函数,数据就不会发送到 PHP。

【讨论】:

    【解决方案5】:

    您需要为您的列 Col1 指定一个唯一别名,因为它在 join 中使用,这需要唯一的列相互匹配。如果遇到重复的列,它将抛出错误 1060。检查这个:Duplicate column names in SQL query

    在您的情况下,MySQL 与表 1 和表 2 中的 Col1 混淆,因此出现错误。用过之后可以SELECT COUNT(*) from YourQuery

    【讨论】:

    • 成功了!此外,只需删除 ', Alias2 。 * ' 来自所有 3 个 SELECTS 的效果也很好。谢谢雷吉!
    猜你喜欢
    • 2010-10-11
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多