2011-03-06 6 views
0

私はテーブルを持っています。MySQLデータベースクエリに

それはように構成されている:

CREATE TABLE `wall` (
     `wall_id` int(10) NOT NULL auto_increment, 
     `user_id` int(10) NOT NULL, 
     `wall_content` varchar(1024) NOT NULL, 
     `time_posted` varchar(64) NOT NULL, 
     `is_reply` int(10) NOT NULL, 
     PRIMARY KEY (`wall_id`) 
    ) ENGINE=MyISAM 

列「is_reply」は、の返信された「wall_id」のIDであろう。他のテーブルの内部結合に基づいてすべての行を取得し、user_idを相互参照し、その下のコメントをグループ化するクエリを構造化するにはどうすればいいですか?

現在のクエリは、コメントをグループ化せずにそれを行います。それは:

SELECT wall.*, user_wall.*, users.username, users.avatar_id 
FROM `wall` 
INNER JOIN user_wall ON user_wall.wall_id = wall.wall_id 
INNER JOIN users ON users.user_id = wall.user_id 
WHERE user_wall.user_id=15 

私はあなたがこれを理解することを望みます。

編集: テーブル 'user_wall'は、ユーザの壁にどのような値が格納されているかを示すテーブルで、 'wall'テーブルには実際に投稿されたものが格納されます。 'wall'テーブルのuser_idは、その投稿を投稿したユーザーの参照です。

現在のクエリ上記のようなとして完全に機能しているとリターンデータ:

wall_id | user_id | wall_content | time_posted | is_reply | user_id | wall_id | username | avatar_id 
    1 | 1 | *content* | *time*  | 0  | 2 | 1 | User1 |  1 
    2 | 1 | *content2* | *time2* | 0  | 2 | 2 | User1 |  1 
    3 | 1 | *content3* | *time3* | 1  | 1 | 3 | User1 |  1 

私の質問は、結果はとても似ているので、どのようにクエリを構築します、であるのに対し:

wall_id | user_id | wall_content | time_posted | is_reply | user_id | wall_id | username | avatar_id 
    1 | 1 | *content* | *time*  | 0  | 2 | 1 | User1 |  1 
    3 | 1 | *content3* | *time3* | 1  | 1 | 3 | User1 |  1 
    2 | 1 | *content2* | *time2* | 0  | 2 | 2 | User1 |  1 

'wall_id'が3で、 'is_reply'が1の行が 'wall_id'の行の下にある行。同様に、 'is_reply'が2の行は、 'wall_id'が2の行になります。

+1

あなたはuser_wallと呼ばれる結合テーブルを持っているか来ますか?ウォールテーブル内のuser_idのポイントは何ですか? – Jacob

+0

理想的には、結果セットはどのように見えますか?あなたの目標出力が何であるかのいくつかの役割を私たちに教えてください。 – dmcnelis

+0

は私の例でより具体的なデータを追加しました。 – FraserK

答えて

0

。これはそれを行う必要があります。

ORDER BY IF(wall.is_reply, wall.is_reply, wall.wall_id), wall.wall_id 

フォーマット:IF(EXPRESSION、IF_TRUE、IF_FALSE)

+0

素晴らしい!完璧。ありがとう – FraserK

0

SQLは1つのテーブル(wall_commentsなど)から複数の行を返すことはできません。それが結合されたもの。言い換えれば、それはできません。同じ結果を得る代わりに、2つのSQLクエリといくつかのPHPコードを使用する代替方法があります。

クエリ#1:

SELECT wall_comments.* 
FROM `wall_comments` 
INNER JOIN user_wall ON wall_comments.wall_id = user_wall.wall_id 
WHERE user_wall.user_id=15 

クエリ#2:

SELECT wall.*, user_wall.*, users.username, users.avatar_id 
FROM `wall` 
INNER JOIN user_wall ON user_wall.wall_id = wall.wall_id 
INNER JOIN users ON users.user_id = wall.user_id 
WHERE user_wall.user_id=15 

PHP:今、あなたは私はあなたが何を意味するかを理解し、それを編集したことを

<?php 
$result1 = mysql_query($query1); 
$result2 = mysql_query($query2); 

$comments = array(); 
while($row = mysql_fetch_assoc($result1)) 
{ 
    $comments[$row['wall_id']][] = $row; 
} 

$walls = array(); 
while($row = mysql_fetch_assoc($result2)) 
{ 
    $walls[] = array_merge(
       $row, 
       array(
       'comments' => isset($comments[$row['wall_id']]) ? $comments[$row['wall_id']] : array(), 
       ), 
      ); 
} 
?> 
+0

申し訳ありませんあなたは私のクエリを完全に理解しているとは思えません。私はあなたのことを完全に理解していません。 'quote'" SQLは1つのテーブル(wall_commentsなど) "。"終わり引用 " – FraserK

関連する問題