SQL Join возвращает только 1 строку - PullRequest
0 голосов
/ 09 января 2011

Не совсем уверен, что мне не хватает, но мой оператор SQL возвращает только одну строку.

  SELECT 
    tl.*, 
    (tl.topic_total_rating/tl.topic_rates) as topic_rating, 
    COUNT(pl.post_id) - 1 as reply_count, 
    MIN(pl.post_time) AS topic_time, 
    MAX(pl.post_time) AS topic_bump 
  FROM topic_list tl 
    JOIN post_list pl 
      ON tl.topic_id=pl.post_parent 
    WHERE 
      tl.topic_board_link = %i 
      AND topic_hidden != 1 
    ORDER BY %s

У меня есть две таблицы (post_list и topic_list) и post_parent post_list для ссылки на topic_list topic_list theme_id.

Вместо того, чтобы возвращать все темы (где для theme_board_link их доски n), он возвращает только одну тему.

1 Ответ

2 голосов
/ 09 января 2011

Обычно вам понадобится предложение GROUP BY. В MySQL правила, отличные от стандартного SQL, зависят от того, когда требуется GROUP BY. Поэтому это ближе к стандартному SQL:

SELECT tl.*, 
       (tl.topic_total_rating/tl.topic_rates) AS topic_rating, 
       COUNT(pl.post_id) - 1 AS reply_count, 
       MIN(pl.post_time) AS topic_time, 
       MAX(pl.post_time) AS topic_bump 
  FROM topic_list AS tl 
  JOIN post_list  AS pl ON tl.topic_id = pl.post_parent 
 WHERE tl.topic_board_link = ?   -- %i
   AND tl.topic_hidden != 1 
 GROUP BY tl.col1, ..., topic_rating
 ORDER BY ?   -- %s

В стандартном SQL вам нужно будет перечислить каждый столбец в topic_list плюс неагрегированное значение topic_rating (и вам, возможно, придется перечислить выражение, а не отображаемую метку или псевдоним столбца в списке выбора).

У вас также есть условие ограничения для topic_board_link, которое может ограничивать ваш набор результатов одной группой. Обычно вы не можете использовать заполнитель в предложении ORDER BY.

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