php
  • mysql
  • 2013-04-06 116 views 1 likes 
    1

    我試圖通過子查詢(qcat)表獲取問題訂單的記錄。和我的代碼是子查詢訂單

    "SELECT * FROM question 
    where survey_name='$_SESSION[ssn_sname]' AND 
         qcategory IN 
         (SELECT qcategory FROM qcat 
          WHERE client_name='$_SESSION[ssn_sname]' 
          GROUP BY qcategory 
          ORDER BY p_order 
         ) AND 
         status='1' AND 
         survey_name LIKE'%$sname% 
    LIMIT $start, $limit"; 
    

    但它沒有得到結果的順序。

    我怎樣才能得到由qcat表的行順序?

    +0

    這將有助於瞭解兩個表中每個表中的所有列。 – Aiias 2013-04-06 06:17:00

    +0

    此查詢中沒有聚合函數,因此GROUP BY不合適。命名您實際想要返回的列,並查看JOIN和SELECT DISTINCT – Strawberry 2013-04-06 07:37:59

    回答

    -1

    您需要加入qcat表以便能夠對該表中的不同列進行排序。試試這個:

    $query = " 
        SELECT q.id question_id, q.*, c.* 
        FROM question q 
        INNER JOIN qcat c ON c.category = q.category 
        WHERE q.survey_name='$_SESSION[ssn_sname]' 
        AND c.client_name = '$_SESSION[ssn_sname]' 
        AND q.status='1' 
        AND q.survey_name like '%$sname%' 
        GROUP BY q.id 
        ORDER BY c.p_order 
        LIMIT $start, $limit"; 
    

    注:您的查詢很容易受到SQL Injection

    +0

    如何保護我的查詢到SQL Injectio? – ukdub 2013-04-06 06:46:05

    +0

    如果您沒有使用[PDO](http://www.php.net/manual/en/class.pdo.php)或某些爲您清理查詢參數的API,請務必運行['mysqli_real_escape_string()' ](http://www.php.net/manual/en/mysqli.real-escape-string.php)在運行查詢之前對您的查詢的任何參數。例如,你應該只在'mysqli_real_escape_string'運行''__SESSION [ssn_sname] = mysqli_real_escape_string($ _ SESSION [ssn_sname]);' – Aiias 2013-04-06 06:49:41

    +0

    order =解決了,但是當我試圖讓問題id像$ row [id]它獲取qcat表的qcategory id而不是問題id。我應該如何調用問題ID? – ukdub 2013-04-06 07:24:31

    0
    1. 在子查詢,你不需要GROUP BY條款 - 這是用於聚合函數
    2. 你也不必在子查詢中ORDER BY - 讓MySQL的做出來的in
    3. 爲整個查詢添加ORDER BY。即在年底

    所以SQL應該

    "SELECT * FROM question 
    where survey_name='$_SESSION[ssn_sname]' AND 
         qcategory IN 
         (SELECT qcategory FROM qcat 
          WHERE client_name='$_SESSION[ssn_sname]'    
         ) AND 
         status='1' AND 
         survey_name LIKE'%$sname% 
    ORDER BY p_order 
    LIMIT $start, $limit"; 
    

    我也認爲你可能能夠避免在首位的子查詢。但是那需要一點思考和關於表格的更多知識。

    順便說一句 - 注意SQL注入的可能性

    相關問題