Таблица вызовов SQL из подзапроса1 в подзапрос2 - PullRequest
0 голосов
/ 07 марта 2012

Мой SQL-запрос:

SELECT 
    upd.*,
    usr.username AS `username`,
    usr.profile_picture AS `profile_picture`

    ,(
      SELECT
        COUNT(lik.id)
      FROM
        likes as lik
      WHERE
        upd.update_id = lik.item_id
        AND
        lik.uid = 118697835834
        AND lik.type=0
    ) as liked_update,
    (
      SELECT
        COUNT(fav.id)
      FROM
        favorites as fav
      WHERE
        upd.update_id = fav.item_id
        AND
        fav.uid = 118697835834
        AND fav.type=0
    ) as favorited_update

FROM 
    updates AS upd
    LEFT JOIN 
        users AS usr 
            ON upd.uid = usr.uid
WHERE
    upd.deleted=0
  AND
    (
      upd.uid=118697835834
      OR EXISTS
        (
          SELECT
            *
          FROM
            subscribers AS sub 
          WHERE
            upd.uid = sub.suid
              AND sub.uid = 118697835834
        )
    OR EXISTS
      (
        SELECT
          *
        FROM
          topics as topic
        WHERE
          upd.uid = topic.uid
          AND sub.uid = 118697835834
      )
    )

ORDER BY upd.date DESC
LIMIT 0, 15

я получаю сообщение об ошибке, потому что sub не может быть вызвано в подзапросе 2, поскольку оно только в подзапросе1 ... как я могу убедиться, что могу вызывать его и в подзапросе2? я должен оставить подписчиков выше на FROM?

Unknown column 'sub.uid' in 'where clause'

Ответы [ 4 ]

2 голосов
/ 07 марта 2012

Я пытался переписать ваш запрос, сохранив вашу оригинальную логику ... но мне очень непонятно в некоторых частях логики, особенно в темах.

SELECT DISTINCT
    upd.*, -- Probably should not be doing * here...
    usr.username AS `username`,
    usr.profile_picture AS `profile_picture`
    COUNT(DISTINCT lik.id) AS `liked_update`,
    COUNT(DISTINCT fav.id) AS `favorited_update`
FROM 
    updates AS upd
    LEFT JOIN subscribers AS sub ON upd.uid = sub.suid
    LEFT JOIN topics as topic ON upd.uid = topic.uid
    LEFT JOIN users AS usr ON upd.uid = usr.uid
    LEFT JOIN likes AS lik 
        ON lik.item_id = upd.update_id 
        AND lik.uid = upd.uid
        AND lik.type = 0
    LEFT JOIN favorites as fav
        ON upd.update_id = fav.item_id
        AND fav.uid = upd.uid
        AND fav.type=0
WHERE
    upd.deleted = 0
    AND (
        upd.uid = 118697835834 
        OR sub.uid = 118697835834
        OR (topic.uid IS NOT NULL AND sub.uid = 118697835834)
    )
GROUP BY upd..., usr.username, usr.profile_picture
ORDER BY upd.date DESC
LIMIT 0, 15
1 голос
/ 07 марта 2012

Я не думаю, что вам даже нужны подзапросы. Скорее всего, вы можете сделать все это с помощью объединений, что-то похожее на это (хотя, это просто оценка без знания ваших таблиц):

SELECT *
FROM your_main_table upd
INNER JOIN subscribers sub
  ON upd.uid = sub.suid
INNER JOIN topics topic
  ON upd.uid = topic.uid
WHERE sub.uid = :user
1 голос
/ 07 марта 2012

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не проверено, и почти гарантировано , если потребуется некоторая настройка, чтобы он делал то, что вы хотите, но я думаю, что это довольно близко к тому, что вы хотите:

SELECT 
    upd.*,
    usr.username AS username,
    usr.profile_picture AS profile_picture,
    COUNT(lik.id) AS liked_update,
    COUNT(fav.id) AS favorited_update
FROM 
    updates upd
    INNER JOIN subscribers sub ON upd.uid = sub.suid
    INNER JOIN topics topic ON upd.uid = topic.uid
    LEFT JOIN users usr ON upd.uid = usr.uid
    LEFT JOIN likes lik ON upd.update_id = lik.item_id AND upd.uid = lik.uid AND lik.type = 0
    LEFT JOIN favorites fav ON upd.update_id = fav.item_id AND upd.uid = fav.uid AND fav.type = 0
WHERE
    upd.deleted = 0
    AND (
        upd.uid = 118697835834
        OR sub.uid = 118697835834
    )
GROUP BY
    upd.*,
    usr.username,
    usr.profile_picture
ORDER BY upd.date DESC
LIMIT 15
0 голосов
/ 07 марта 2012

Эти подзапросы являются независимыми подзапросами и не могут совместно использовать какие-либо данные. Вам потребуется выполнить объединение во втором подзапросе, чтобы получить результат, который вы ищете.

Кроме того, вполне вероятно, что вы могли бы сделать это без подзапросов и использовать только объединения, что намного быстрее.

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