2011-09-20 89 views
2

我有一个现有的mysql查询,我需要添加到,我不知道如何去做。帮助复杂的mysql查询

这是我目前的sql查询。

SELECT tbl_brokerage_names.brokerage_id, tbl_brokerage_names.short_name, 
    b.indication, b.max_indication 
    FROM tbl_brokerage_names 
    LEFT JOIN (
    SELECT * FROM tbl_recommendation_brokerages 
    WHERE recommendation_id = {$_GET['id']} 
) b ON (tbl_brokerage_names.brokerage_id = b.brokerage_id) 
ORDER BY tbl_brokerage_names.short_name ASC 

这是我需要处理上一个查询的查询。

SELECT * , COUNT(*) 
    FROM tbl_streetaccounts 
    JOIN tbl_brokerage_names 
WHERE tbl_brokerage_names.brokerage_id = tbl_streetaccounts.brokerage_id 

基本上我需要返回一个计数,所以我需要结合这两个查询。

回答

1

您应该将这些作为两个单独的查询来运行。

COUNT(*)查询将返回单个行,因此无法将其与第一个查询“结合”,同时保留第一个查询的多行结果。

此外,当你SELECT *, COUNT(*)你会得到一些任意行的列。


顺便说一下,您有一个明显的SQL injection漏洞。请勿直接在您的SQL查询中插入$_GET参数。相反,它强制为一个整数:

<?php 
$id = (int) $_GET['id']; 
$sql = "SELECT ... WHERE recommendation_id = {$id}"; 
+0

如果我将COUNT(*)更改为COUNT(tbl_streetaccounts.brokerage_id) –

+0

@Bill,我不赞成这种解决方案,它在处理字符串时会中断。为什么不使用'mysql_real_escape_string()'和'“SELECT ... WHERE recommendation_id ='$ id'”;'。这总是安全的,无论是整数或字符串。 – Johan

+0

@Johan:在“id”列应与整数(实际上总是为真)进行比较的情况下,将值强制转换为((int))更简单快捷。如果id列是非整数,那么可以像你说的那样使用mysql_real_escape_string。 –

0

像@Bill说,你不能让每一个行中的计数,而很奇怪的语法,但你可以使用GROUP BY ... WITH ROLLUP整体计数。

例如为:

<?php 
$id = mysql_real_escape_string($_GET['id']); //works with anything, not just numbers 
$query = " 
    SELECT tbl_brokerage_names.brokerage_id 
     , tbl_brokerage_names.short_name 
     , b.indication 
     , b.max_indication 
     , count(*) as rowcount 
    FROM tbl_brokerage_names 
    LEFT JOIN (
     SELECT * FROM tbl_recommendation_brokerages 
     WHERE recommendation_id = '$id' //The single quotes are essential for safety! 
    ) b ON (tbl_brokerage_names.brokerage_id = b.brokerage_id) 
    GROUP BY tbl_brokerage_names.brokerage_id WITH ROLLUP 
    ORDER BY tbl_brokerage_names.short_name ASC 
"; 

GROUP BY .. WITH ROLLUP将额外的行添加到所有NULL对非聚合列和总计数的结果。

如果你有任何行,其中rowcount > 0那么你需要添加额外的从b子句到group by子句,以防止MySQL隐藏任意行。
tbl_brokerage_names已被完全定义,因为您是按主键进行分组。