MySQL - предложение WHERE в сочетании с LEFT JOIN? - PullRequest
2 голосов
/ 01 марта 2011

В запрос 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'];
}

?>

Ответы [ 2 ]

6 голосов
/ 01 марта 2011

SQL означает Структурированный Язык запросов - вы не можете поместить предложение WHERE в нужное место в запросе.Предложение WHERE должно быть после предложений FROM / JOIN, а также перед предложениями GROUP BY, HAVING и ORDER BY.IE:

   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);
1 голос
/ 01 марта 2011

Поместите предложение 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"
...