SQL-соединение с подсчетом не работает - PullRequest
1 голос
/ 18 марта 2011
SELECT p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
    (
        SELECT COUNT(f.FlagTime)
            FROM Flags as f 
                JOIN Posts as p 
                ON p.PostPID = f.FlagPID
    ) as PostFlags
    FROM Posts AS p
        JOIN Users AS u
        ON p.PostUID = u.UserUID
    ORDER BY PostTime DESC
    LIMIT 0, 30

У меня есть этот запрос, и я не знаю почему, но этот фрагмент кода, кажется, не работает, он возвращает запрос, как если бы он был следующим:

SELECT p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
    (
        SELECT COUNT(f.FlagTime)
            FROM Flags as f 
    ) as PostFlags
    FROM Posts AS p
        JOIN Users AS u
        ON p.PostUID = u.UserUID
    ORDER BY PostTime DESC
    LIMIT 0, 30

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 18 марта 2011

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

Однако я замечаю, что ваш подзапрос (PostFlags) содержитСтол сообщений, как и ваш основной запрос.И они даже имеют один и тот же псевдоним.


Из этого я могу сделать вывод, что вы хотите получить одну из двух вещей ...

  1. Количество всех флагов для всех сообщений
    Это даст одинаковое значение для каждой записи в ваших результатах

  2. Количество всех флагов длятекущее сообщение
    Это даст другое значение для каждой записи в ваших результатах


Если вы хотите первую версиюЯ бы изменил псевдонимы подзапроса.Вместо использования «P» используйте «Px» или что-то еще.Я не думаю, что это обязательно что-то изменит, но использование того же псевдонима, что и основной запрос, может запутать читателя, не говоря уже о СУБД.


Если вам нужна версияво-вторых, вам не нужно включать соединение в подзапрос.Вместо этого вы можете сделать следующее ...

SELECT
  p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
  (
      SELECT COUNT(FlagTime)
      FROM Flags
      WHERE FlagPID = p.PostPID
  ) as PostFlags
FROM
  Posts AS p
JOIN
  Users AS u
    ON p.PostUID = u.UserUID
ORDER BY
  PostTime DESC
LIMIT 0, 30

Предложение where теперь ссылается на таблицу Posts из основного запроса.Это становится Correlated-Sub-Query - результат варьируется в зависимости от значения поля в другой таблице.


Если ни один из них не является тем, что вам нужно, приведите примеры;
- Пример данных
- Пример результатов
- Ожидаемые результаты
- Описание причин, по которым они ожидаются

1 голос
/ 18 марта 2011
SELECT p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
    (
        SELECT COUNT(f.FlagTime)
            FROM Flags as f 
                JOIN Posts as p1
                ON p1.PostPID = f.FlagPID
                where p1.PostPID = p.PostPID
    ) as PostFlags
FROM Posts AS p
    JOIN Users AS u
    ON p.PostUID = u.UserUID
ORDER BY PostTime DESC
LIMIT 0, 30

Edit:

Думаю, так будет лучше:

SELECT p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep,
    count(f.FlagTime) as PostFlags

FROM Posts AS p
JOIN Users AS u ON p.PostUID = u.UserUID
left join Flags f on p.PostPID = f.FlagPID

group by p.PostPID, p.PostUID, p.PostText, p.PostTime, u.UserUID, u.UserName, u.UserImage, u.UserRep

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