2011-09-20 84 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已被完全定義,因爲您是按主鍵進行分組。