Несколько в операторах выбора в одном запросе

0

В настоящее время я пытаюсь выбрать список сообщений от людей, которые являются друзьями и/или за ними следует текущий пользователь. Однако я столкнулся с проблемой, когда добавляю во второй оператор для following таблицы.

SELECT * FROM login, threads WHERE login.id=threads.poster_id AND deleted=0 AND login.id
   IN ((SELECT CASE WHEN second_id=? THEN first_id ELSE second_id END FROM friends WHERE first_id=? OR second_id=?)
   AND (SELECT CASE WHEN follower=? THEN following ELSE follower END FROM following WHERE follower=?))
ORDER BY threads.posted DESC LIMIT 20
Теги:
adodb

1 ответ

2
Лучший ответ

Просто используйте два явных условия IN с двумя подзапросами:

SELECT *
FROM login
INNER JOIN threads
    ON login.id = threads.poster_id
WHERE
    deleted = 0 AND
    (login.id IN (SELECT CASE WHEN second_id=? THEN first_id ELSE second_id END
                  FROM friends WHERE first_id=? OR second_id=?) AND
     login_id IN (SELECT CASE WHEN follower=? THEN following ELSE follower END
                  FROM following WHERE follower=?))
ORDER BY
    threads.posted
DESC LIMIT 20;

Это может исправить ошибки синтаксиса и даже дать вам результат, который вы ожидаете, но я также чувствую, что мы сможем немного очистить запрос. Образцы данных пройдут долгий путь в этом направлении.

  • 0
    Да, это добилось цели - спасибо за помощь! Кроме того, каким образом вы бы порекомендовали мне очистить запрос? Я изменил его на порядок по идентификатору, а не по времени, что должно оказать влияние на производительность.
  • 0
    @SecureServer Я имел в виду, что, возможно, мы могли бы переписать, чтобы избежать этих подзапросов в WHERE .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню