2012-03-17 16 views
1

基本的にユーザーがストーリーを書くことができ、各ストーリーに複数の継続があるウェブサイトを構築していますが、データベースの照会方法を理解しようとしています。ので、私の質問はefficentの方法は何ですSQL繰り返しのデータを返さないジョイン

SELECT idStories, 
     Stories.Title, 
     Stories.Num_parts, 
     Stories.Story, 
     Stories.Date_poste,  
     idStory_continue, 
     Story_continue.Users_idUsers, 
     Story_continue.Title, 
     Story_continue.Story, 
     Story_continue.Date_posted, 
     Story_continue.Part_num 
    FROM Stories s 
LEFT JOIN Story_continue sc ON sc.Stories_idStories = s.idStories 

:私はちょうどそうのような声明に参加を書いている場合、私はなるだろうされ、繰り返しのエントリを取得せずに、最初のストーリーとその話に関連した継続を返すことができます元のストーリーの複数のバージョンを取得せずにこのタイプのクエリを返すことができます。たとえば、私がこれを問い合せると、オリジナルのストーリーをすべて取得します。ストーリーに複数の継続がある場合は、ストーリーを繰り返します。このように情報を提供するクエリを作成できない場合は、PHPでこれをどのように解決するのでしょうか?

+0

「ストーリーズ」テーブルの主キーは何ですか?最初のストーリーが必要な場合は、各ストーリーの「MIN(date_poste)」と比較する必要があります。 ...私はあなたのデータモデルを正しく理解していると仮定します。 –

+0

私には確かではありませんが、私には「グループごとに最大の」質問があります。 –

答えて

1

、GROUP BYを使用してみてくださいカントGROUP_CONCATを実行する必要があります。このGROUP_CONCATは面倒です。
このようにクエリを分割する方が簡単です。とにかくJOIN/GROUP BYより速いのが普通です。

$sql = "SELECT idStories, 
      Stories.Title, 
      Stories.Num_parts, 
      Stories.Story, 
      Stories.Date_posted 
     FROM Stories"; 

$stories = $db->fetchAll($sql); 

$ids = array(); 
foreach($stories as $row){ 
    $ids[] = $row['idStories']; 
} 
$ids = implode(",",$ids); 

$sql = "SELECT idStory_continue, 
      Story_continue.Users_idUsers, 
      Story_continue.Title, 
      Story_continue.Story, 
      Story_continue.Date_posted, 
      Story_continue.Part_num, 
      Stories_idStories 
     FROM Story_continue IN ($ids)"; 

$rows = $db->fetchAll($sql); 

$continues = array(); 
foreach($rows as $row){ 
    // Continues can be referenced by the story id 
    $continues[$row['Stories_idStories']][] = $row; 
} 
+0

これは非常に役に立ちます。どうもありがとうございました!これはまさに私が探していたものです。 –

2

beginnning

+0

DISTINCTはすべての列に渡ります。いいえ、これは機能しません。 –

+0

@DMGポニー:いいえ、列単位で表示されます。構文は次のとおりです。SELECT DISTINCT column_name FROM table_name – Beel

関連する問題