У меня есть эта структура таблицы:
// 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
, то эти две строки являются ненужными и бесполезными.
Как я могу реализовать это условие и улучшить этот запрос?