2012-01-15 7 views
1

複数のテーブルから選択し、最新のものから古いものまですべてを順序付けるのは良い方法ですか?mysqlクエリ複数から選択、日付順

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

もし私がそういったことをしたいならば。

+0

テーブルの構造を含む例を与えてくださいとあなたが達成しようとしている結果の例。 – Paker

答えて

1

個々のSELECTステートメントを括弧と最後の後 BY ORDERまたはLIMITを置き、全体UNION 結果をソートしたり制限する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の エイリアスを参照します。 (あるいは、その列の位置を使用して ために列を参照ただし、カラム位置の使用 は推奨されている)

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

1

あなたの既存のクエリは、あなたが望むことをしません。代わりに、あなたは、いくつかの共通の列に、あなたのテーブルを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 
+0

ありがとうございました(上記のクエリは情報が使用される曖昧な例でしたが、感謝しています) –

5
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 
関連する問題