Как правило, если вы используете CASE (или любую другую if/then logic) в SQL, вы, вероятно, ошибаетесь. SQL - это декларативный язык, что означает, что вы задаете ему вопросы. Если вы говорите, как ответить на вопрос, это, вероятно, закончится плохо (или медленно). Ключ состоит в том, чтобы поместить сдерживающий ID пользователя в предложение WHERE и оставить его вне соединения. Это заставляет его не сообщать базе данных о том, как выполнять свою работу, задавать базу данных. База данных позаботится обо всем остальном.
Использование синтаксиса JOIN позволяет уточнить, что такое соединение и какое ограничение. SQL joins - это то, что нужно использовать, когда вам нужны строки из нескольких таблиц, сшитых вместе. Базы данных знают, как их оптимизировать.
Второй бит - use EXPLAIN, чтобы рассказать вам, как MySQL выполняет запрос, где он медленный. Обычно это указывает, где вам нужны индексы или какая часть запроса должна быть переписана.
я буду считать, что Relationship.leader
и Relationship.subscriber
являются внешними ключами на User.id
и описать, кто следует, что пользователь, и кто они следуют, и вы хотите, чтобы показать, что каждый пользователь, связанный с данным USER_ID
. В CASE не должно быть необходимости, вы можете просто проверить, совпадают ли они (проверьте меня на этом).
SELECT F.status, U.username, U.email, UI.country, UI.birthday, P.thumb_url
FROM user U
JOIN user_info UI
ON U.id = UI.user_id
JOIN photo P
ON UI.main_photo = P.id
JOIN relation F
ON F.leader = U.id OR F.subscriber = U.id
WHERE F.status='1'
AND U.id = ?
UPDATE: Понимание теперь, что он должен быть список друзей пользователя, изменить U.id = ?
проверить, что пользователь находится в отношениях, а не.
Мы хотим найти список отношений, но мы используем пользователей в качестве основной таблицы. Это немного неудобно. @fraxool's query which is FROM relation имеет больше смысла, но он может использовать некоторую очистку о том, что такое ограничение. JOIN ON - только о сетчатых столах. ГДЕ для ограничения того, что возвращается в целом. Применение этих принципов к новому запросу @ fraxool, мы получаем ...
SELECT username, email, ui.gender, ui.country, ui.birthday, p.thumb_url
FROM relation R
JOIN user U
ON U.id = R.leader OR U.id = R.subscriber
JOIN user_info UI
ON U.id = UI.user_id
JOIN photo P
ON UI.main_photo = P.id
WHERE R.status = 1
AND (R.leader = ? OR R.subscriber = ?)
Дополнительное ограничение U.id != ?
ненужно, если вы не можете быть ваш собственный друг. Это то, что должно быть обработано в ограничениях столбцов для отношений .leader и relation.subscriber.
Вы, кажется, использует фильтры, где вы должны использовать таблицу соединений. – Hamish
Ключевое слово join существует около 25 лет. Лучше всего использовать его. – Bohemian
Я собираюсь предположить, что 'USER_ID' является заполнителем идентификатора пользователя, для которого вы строите список. Также ваша схема недействительна, время не имеет ПО УМОЛЧАНИЮ. – Schwern