MySQL запрос выбрать из нескольких, порядок по дате - PullRequest
1 голос
/ 15 января 2012

Какой хороший и простой способ выбрать из нескольких таблиц и просто упорядочить все по дате, от самого нового до самого старого?

 mysql_query("
               SELECT * 
               FROM posts, comments, photos 
               WHERE userID='$session' 
               ORDER BY date");

, если бы я хотел сделать что-то подобное.

Ответы [ 3 ]

5 голосов
/ 15 января 2012
SELECT *
FROM (SELECT userID, Col1, Col2, Col3, date
      FROM posts
      UNION
      SELECT userID, Col1, Col2, Col3, date
      FROM comments
      SELECT userID, Col1, Col2, Col3, date
      FROM photos ) t
WHERE userID = 123
ORDER BY date DESC
1 голос
/ 15 января 2012

Чтобы использовать предложение ORDER BY или LIMIT для сортировки или ограничения всего результата UNION, заключите в скобки отдельные операторы SELECT и поместите ORDER BY или LIMIT после последнего.В следующем примере используются оба предложения:

(SELECT a FROM t1 WHERE a=10 AND B=1) UNION 
(SELECT a FROM t2 WHERE a=11 AND B=2) 
ORDER BY a LIMIT 10;

Оператор без круглых скобок эквивалентен одной скобке, как только что показано.

Этот тип ORDER BY не может использовать ссылки на столбцыкоторые включают в себя имя таблицы (то есть имена в формате tbl_name.col_name).Вместо этого укажите псевдоним столбца в первом операторе SELECT и обратитесь к псевдониму в ORDER BY.(В качестве альтернативы, обратитесь к столбцу в ORDER BY, используя его позицию в столбце. Однако использование позиций столбца не рекомендуется.)

-> http://dev.mysql.com/doc/refman/5.0/en/union.html

1 голос
/ 15 января 2012

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

SELECT
  posts.*,
  comments.*,
  photos.*
FROM 
  posts JOIN comments ON posts.post_id = comments.post_id
  JOIN photos ON posts.post_id = photos.post_id
ORDER BY posts.date DESC

Обратите внимание, что часто не рекомендуется делать SELECT * или SELECT posts.* в рабочем коде.Как правило, лучше явно перечислить нужные столбцы, чтобы вы могли быть уверены в порядке их поступления (например, для UNION запросов) и в случае изменения вашей схемы.

SELECT
  posts.date,
  posts.post_id,
  posts.title,
  posts.etc,
  comments.date,
  comments.user,
  comments.text,
  photos.title
FROM
  posts JOIN comments ON posts.post_id = comments.post_id
  JOIN photos ON posts.post_id = photos.post_id

/* Also, if multiple tables have a `date` column, you'll need to specify which one
   as in `posts`.`date` */
ORDER BY posts.date DESC
...