2011-09-20 4 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 취약점이 있습니다. $_GET 매개 변수를 SQL 쿼리에서 직접 보간하지 마십시오. @ 빌 말했듯이

<?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

, 당신은 정말 이상한 구문없이 모든 행의 수를 얻을 수 없다,하지만 당신은 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이있는 행이있는 경우 테이블의 추가 절을 group by 절에 추가하여 MySQL이 임의 행을 숨기지 않도록해야합니다.
tbl_brokerage_names은 기본 키로 그룹화하므로 이미 완전히 정의되어 있습니다.