2011-08-22 48 views
0

这感觉应该很容易,但我无法得到它,我试过了一切。MySQL:如何计算复杂查询返回的行数

我怎样才能只是获得了该查询返回的行数:

(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 - 重复列名 '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 
+3

为什么包装整个查询放在括号中(使它成为子查询)并对其执行SELECT COUNT(*)失败?它是否返回错误信息? – FrustratedWithFormsDesigner

+0

当您将它包装在Select Count(*)FROM(您的长查询)AS CountThis中时会发生什么。你有没有得到一个特定的错误,或者你得到错误的计数? – Kibbee

+2

你不提供一个不使用'mysql_num_rows()'的好理由。这是有原因的...使用它。你为什么期望它很慢? – Brad

回答

1

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

在你的情况下,MySQL与表1和表2中的Col1混淆,因此错误。一旦你已经使用过,你可以SELECT COUNT(*) from YourQuery

+1

工作正常!另外,只需删除',Alias2。 *'来自所有3个SELECTS。谢谢reggie! – ProgrammerGirl

4

环绕你整个查询括号(使它成为一个子查询),并从中做一个SELECT COUNT(*):

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

这给了我一个错误。 – ProgrammerGirl

+0

实际错误是:#1248 - 每个派生表都必须有自己的别名 – ProgrammerGirl

+1

尝试在每个UNIONED查询后放置一个别名。即从((选择...)中选择计数(*)联合(选择...)b联合(选择...)c)a –

1

整个包住查询作为

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

这给了我以下错误:#1248 - 每个派生表必须具有自己的别名 – ProgrammerGirl

1

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

无论如何,当您只使用mysql_num_rows函数时,数据不会发送到PHP。

1

您需要为您的列Col1指定一个唯一的别名,因为它用于需要唯一列彼此匹配的join。如果遇到重复列,它将引发错误1060。检查此:Duplicate column names in SQL query

在你的情况下,MySQL与表1和表2中的Col1混淆,因此错误。一旦你使用了,你可以SELECT COUNT(*) from YourQuery

+0

工作正常!另外,只需删除',Alias2。 *'来自所有3个SELECTS。谢谢reggie! – ProgrammerGirl