Почему этот запрос SQL JOIN не работает? - PullRequest
0 голосов
/ 30 ноября 2011

Я хочу получить каждый «Forum_THREADS», на который пользователь отправил или ответил.

Когда он отвечает, он находится в таблице «Forum_REPLIES».

Вот мой запрос:

    $threads = mysql_query("SELECT * FROM FORUM_Threads
        INNER JOIN FORUM_Replies
        ON
        FORUM_Threads.Poster = $userRow->ID
        OR
        (
            FORUM_Replies.Poster = $userRow->ID
            AND
            FORUM_Replies.ThreadID = FORUM_Threads.ID
        )
    ");

В данный момент он не работает должным образом, и когда он это сделает, я бы подумал, что он будет несколько раз получать потоки.Есть ли лучший способ сделать это, когда он не будет извлекать потоки несколько раз, и он будет работать правильно?

Forum_REPLIES - это просто дубликат Forum_THREADS с полем ThreadID.

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Это не работает, потому что вы должны присоединиться к столбцу в FORUM_Replies, а не к скалярному значению ($userRow->ID).

Похоже, вы используете JOIN там, где вы действительно должны использоватьГДЕ оговорка.

2 голосов
/ 30 ноября 2011

Я думаю, это должно работать

 SELECT * 
    FROM FORUM_Threads
    INNER JOIN FORUM_Replies
    ON
    FORUM_Threads.ThreadId = FORUM_Replies.Thread_Id
    where
    FORUM_Threads.Poster = $userRow->ID
    OR
    FORUM_Replies.Poster = $userRow->ID

Предполагая, что ThreadId - это имя ключа, вам необходимо выполнить соединение с ключами.

0 голосов
/ 30 ноября 2011

У меня такое чувство, что вы вместо этого хотите:

$threads = mysql_query("
    SELECT * FROM FORUM_Threads
    WHERE FORUM_Threads.Poster = $userRow->ID
    OR EXISTS
    (
        SELECT * FROM FORUM_Replies
        WHERE FORUM_Replies.ThreadID = FORUM_Threads.ID
        AND FORUM_Replies.Poster = $userRow->ID
    )
");

Если вы используете объединение с таблицей ответов, вы получите дубликаты потоков, если пользователь ответил на поток более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...