php
  • mysql
  • 2013-04-06 87 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注入的可能性

    相关问题