【问题标题】:MySQL - WHERE clause coupled with LEFT JOIN?MySQL - WHERE 子句加上 LEFT JOIN?
【发布时间】:2011-07-06 04:54:06
【问题描述】:

在 MYSQL 查询中,我试图插入一个 WHERE 子句(出现在下面的 PHP 注释中的那个)。每当我将此子句放在 MYSQL 查询语句中时,它总是会失败(我在 LEFT JOIN 和 ORDER BY 子句之前都尝试过)。

关于如何让我的陈述发挥作用的任何想法?

<?php
$result = mysql_query("SELECT * 
                         FROM Items 
                    LEFT JOIN Topics on Topics.TopicID = Items.FK_TopicID 
                     ORDER BY TopicSort, TopicName ASC, ItemSort, ItemTitle");
/* WHERE FK_UserID=$_SESSION[user_id] */
$topicname = false;

while($row = mysql_fetch_array($result)) {
    if (!$row['TopicID']) {
            $row['TopicName'] = 'Sort Me';
    }
if ($topicname != $row['TopicName']) {
    echo '<ul><li>' . $row['TopicName'] . '</li><ul>';
    $topicname = $row['TopicName'];
}
echo '';
echo '<li>' . $row['ItemTitle'] . '</li>';
echo '';
}
    if ($topicname != $row['TopicName']) {
    echo '</ul>';
    $topicname = $row['TopicName'];
}

?>

【问题讨论】:

  • “失败”是什么意思?您收到错误消息?你得到了数据,却没有得到你想要的数据?

标签: php mysql sql join mysql-error-1064


【解决方案1】:

SQL 代表 Structured 查询语言——您不能将 WHERE 子句放在查询的任何位置。 WHERE 子句必须在 FROM/JOIN 子句之后,并且在 GROUP BY、HAVING 和 ORDER BY 子句之前。即:

   SELECT * 
     FROM ITEMS i
LEFT JOIN TOPICS t ON t.TopicID = i.FK_TopicID 
    WHERE FK_UserID = $_SESSION[user_id]
 ORDER BY TopicSort, TopicName ASC, ItemSort, ItemTitle

为了使自己免受 SQL 注入攻击,更好的选择是使用sprintf

$sql = sprintf("SELECT * 
                  FROM ITEMS i
             LEFT JOIN TOPICS t ON t.TopicID = i.FK_TopicID 
                 WHERE FK_UserID = %u
              ORDER BY TopicSort, TopicName ASC, ItemSort, ItemTitle",
               mysql_real_escape_string($_SESSION[user_id]));

$result = mysql_query($sql);

【讨论】:

  • 感谢您的帮助。我按照概述的顺序放置了它,但仍然出现以下错误。我想 sprintf 以保护自己免受注入攻击,但我想我会先让原件工作。 mysql_fetch_array 在没有 WHERE 子句的情况下可以正常工作,但我需要将其限制为单个 user_id。 '警告:mysql_fetch_array():提供的参数不是有效的 MySQL 结果资源'
【解决方案2】:

将 WHERE 子句放在 ORDER BY 子句之前。 http://dev.mysql.com/doc/refman/5.0/en/join.html

"SELECT * FROM Items LEFT JOIN Topics on Topics.TopicID = Items.FK_TopicID WHERE whateverTableTheFK_UserIDColumnIs.FK_UserID='".$_SESSION['user_id']."' ORDER BY TopicSort, TopicName ASC, ItemSort, ItemTitle"

【讨论】:

  • 谢谢大家。我也错过了whateverTableTheFK_UserIDColumnIs.FK_UserID。非常有帮助!我将学习更多关于结构化查询语言的知识! :)
猜你喜欢
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2014-05-25
  • 2020-05-05
相关资源
最近更新 更多