2012-01-05 101 views
0

我遇到了涉及工会的sql连接问题。我试图从2个表中拉出一个COUNT和一个字段,但出现错误。mySQL UNION错误

查询:

$sql_result7 = mysql_query("(SELECT COUNT (*) as alertcount, date as alertdate FROM alerts WHERE to_id='$id' AND date > '$lastcheck') UNION (SELECT COUNT (*) as mailcount, date maildate FROM mobmail WHERE to_id='$id' AND to_del=0 AND seen = '0')", $db); 

$rs7 = mysql_fetch_array($sql_result7); 
$alerts = $rs7[alertcount]; 
$mails = $rs7[mailcount]; 
$last_alert = $rs7[alertdate]; 
$last_mail = $rs7[maildate]; 

有什么事情做的date as alertdate一部分?

错误即时得到的是:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

+0

有什么错误? – 2012-01-05 00:13:06

+0

你有什么样的错误? – DonCallisto 2012-01-05 00:13:25

+0

此外,我的MySQL是生锈的,但你有“日期maildate”不是“日期maildate”(不知道这是否会改变任何东西)。另外,是不是“日期”保留字? – 2012-01-05 00:14:37

回答

2

除了COUNT(*)之间的空间,还有另外一个问题。你不能在你的PHP代码中使用$rs7[mailcount]也不$rs7[maildate],因为你的查询等效于:

SELECT 
     COUNT(*) as alertcount 
    , date as alertdate 
FROM alerts 
WHERE to_id = '$id' 
    AND date > '$lastcheck' 
UNION 
SELECT 
     COUNT(*)      --- No "as mailcount" here 
    , date       --- No "as maildate" either 
FROM mobmail 
WHERE to_id = '$id' 
    AND to_del = 0 
    AND seen = '0' 

,并返回两行,只有2列:

alertcount | alertdate 
-----------|------------ 
24  | 2012-01-04 
73  | 2011-11-11 

两种方法可以解决这个问题:

要么保持查询(更改UNIONUNION ALL以确保您总是获得2行)并将PHP转换为u在2排。

或更改查询:

SELECT alertcount, alertdate, mailcount, maildate 
FROM 
     (SELECT 
       COUNT(*) AS alertcount 
      , date  AS alertdate 
     FROM alerts 
     WHERE to_id = '$id' 
      AND date > '$lastcheck' 
    ) AS a 
    CROSS JOIN 
     (SELECT 
       COUNT(*) AS mailcount 
      , date  AS maildate 
     FROM mobmail 
     WHERE to_id = '$id' 
      AND to_del = 0 
      AND seen = '0' 
    ) AS b 
+0

啊,想知道为什么它不工作。我怎么能解决这个问题?我是否需要使用UNION ALL或其他东西来返回两个查询结果? – user1022585 2012-01-05 00:56:52

+0

您可以使用PHP中第二行的结果,对不对? – 2012-01-05 01:00:27

+0

那么在这个内部连接查询之前,我有两个单独的查询,而它的工作,但与这个新的查询它没有做它应该做的。它没有返回正确的'mailcount' – user1022585 2012-01-05 01:01:29