Как я могу поставить условие на способ соединения?

У меня есть эта структура таблицы:

// QandA +----+---------------------+----------------------------------------+------+---------+ | Id | title | content | type | related | +----+---------------------+----------------------------------------+------+---------+ | 1 | title of question 1 | content of question1 | 0 | 1 | | 2 | | content of first answer for question1 | 1 | 1 | | 3 | title of question 2 | content of question2 | 0 | 3 | | 4 | | content of second answer for question1 | 1 | 1 | | 5 | | content of first answer for question2 | 1 | 3 | +----+---------------------+----------------------------------------+------+---------+ 

type column: 0 означает, что это вопрос, а 1 означает, что это ответ.

related столбцом: для вопроса этот столбец содержит идентификатор сам по себе, и для ответа в этом столбце содержится идентификатор его вопроса.


Также есть другие зависимые таблицы:

 // Votes +----+---------+---------+-------+ | id | post_id | user_id | value | +----+---------+---------+-------+ | 1 | 1 | 1234 | 1 | | 2 | 2 | 1234 | -1 | | 3 | 1 | 4321 | 1 | +----+---------+---------+-------+ // Favorites +----+---------+---------+ | id | post_id | user_id | +----+---------+---------+ | 1 | 1 | 1234 | | 2 | 1 | 4321 | +----+---------+---------+ 

Хорошо, это основное замечание в моем вопросе: таблица « Favorites относится только к вопросам (а не к ответам) . Ответы никогда не могут быть любимыми (просто вопросы могут быть)


Также здесь мой запрос:

 SELECT p.title, p.content, vv.value AS cuvv -- cuvv is stand for current_user_vote_value, CASE WHEN ff.id IS NOT NULL THEN '2' ELSE '3' END AS cuf -- current_user_favorite (SELECT SUM(v.value) FROM Votes v WHERE p.id = v.post_id) AS total_votes, (SELECT COUNT(1) FROM Favorites f WHERE p.id = f.post_id) AS total_favorites, FROM QandA p LEFT JOIN Votes vv ON p.id = vv.post_id AND vv.user_id = :user_id_1 LEFT JOIN favorites ff ON p.id = ff.post_id AND f.user_id = :user_id_2 WHERE p.related = :id 

Примечание: для cuf , 2 означает, что текущий пользователь отметил этот вопрос как избранный, а 3 означает, что у него не было (другими словами, 3 означает, что этот вопрос не является фаворитом для текущего пользователя) .


Хорошо, позвольте мне передать некоторые параметры для запроса и выполнения: (в качестве примера)

 $user_id = 1234; $id = 1; $sth->bindValue(":user_id_1", $user_id, PDO::PARAM_INT); $sth->bindValue(":user_id_2", $user_id, PDO::PARAM_INT); $sth->bindValue(":id", $id, PDO::PARAM_INT); $sth->execute(); 

И вот вывод:

 -- cuvv is stand for current_user_vote_value -- cuf is stand for current_user_favorite +--------------+----------------------+------+-----+-------------+-----------------+ | title | content | cuvv | cuf | total_votes | total_favorites | +--------------+----------------------+------+-----+-------------+-----------------+ | title of ... | content of que ... | 1 | 2 | 2 | 2 | | | content of fir ... | -1 | 3 | -1 | 0 | | | content of sec ... | NULL | 3 | 0 | 0 | +--------------+----------------------+------+-----+-------------+-----------------+ 

Итак, Каков мой вопрос?

Эти два столбца cuf и total_favorites просто принадлежат к вопросам ( type = 0 ). Но мой запрос этого не знает. Я имею в виду, что мой запрос вычисляет количество всех избранных для всех строк, и я хочу знать, как это можно сказать: вычислить cuf и total_favorites только для вопросов, а не для обоих вопросов и ответов?

Другими словами, мне нужно поставить условие IF чтобы проверить, p.type = 0 ли p.type = 0 следующие две строки:

 (SELECT COUNT(1) FROM Favorites f WHERE p.id = f.post_id) AS total_favorites, 

а также

 LEFT JOIN favorites ff ON p.id = ff.post_id AND f.user_id = :user_id_2 

В противном случае эти две строки не выполняются, потому что если p.type = 1 , то эти две строки являются ненужными и бесполезными.

Как я могу реализовать это условие и улучшить этот запрос?

Related of "Как я могу поставить условие на способ соединения?"