2012-03-08 9 views
1

私は特定の記事を記録するための参照があります。参考文献は、記事、書籍、論文などのタイプのものであってもよい。 それぞれは異なる属性を有する可能性がある。別のテーブルで注文されたmysqlテーブルから値を取得する方法は?

//article_refs table 
ID Article_ID Article_Title Author_Name ... 
1 1   title1  author1 
2 1   title2  author2 

//thesis_refs table 
ID Article_ID Thesis_Title Thesis_Publisher ... 
1 1   thesis1  publisher1 
2 1   thesis2  publisher2 

//ref_types table 
ID Article_ID ReferenceType 
1 1   book 
2 1   article 
3 1   article 
4 1   book 

私がテーブルの1つに挿入するとき、最初にその型(ブック、記事)を持つref_typeテーブルに挿入されます。それが属しているテーブルを挿入します。 (例:記事の場合は記事テーブルに挿入します)

今、リスト参照を順番に行うことができます。

$sql=mysql_query("SELECT * FROM ref_types 
WHERE $article_ID=Article_ID ORDER BY ID ASC"); 
while($row = mysql_fetch_array($sql)){ 
    $counter=1; 

    if($row[2]=="thesis"){ 
     $sqlthesis=mysql_query("SELECT * FROM thesis_refs 
     WHERE $article_ID=Article_ID 
     ORDER BY ID ASC"); 
     while($thesis_row = mysql_fetch_array($sqlthesis)){ 
      echo "record $counter: "; 
      echo $row[2]; 
      echo ", "; 
      echo $thesis_row[2]; 
      echo "<BR>"; 
      $counter++ 
     } 
    }elseif..... 

それはarticleテーブルなどを一覧表示し、すべての論文のレコードを示しています。この方法は...

record 1: book1 
record 2: book2 
record 3: article1 
record 4: article2 

私はそれが理由whileループの単純ですけど、ref_typesテーブルで、この(同じ順序を取得する方法。 。)??

record 1: book1 
record 2: article1 
record 3: article2 
record 4: book2 

ご了承ください。 ありがとうございます。

+0

をもref_thesisテーブルを示し、してくださいテーブル間の主要な関係 –

+0

こんにちは、上記のものと同じ構造をしています。 私は – teutara

+0

を編集しました。私はあなたの誤植を修正します。 –

答えて

1

ref_typesテーブルにReferenceTypeカラムを持つことに加えて、対応するテーブルの実際のIDをforeign keyといいます。

//ref_types table 
ID Article_ID ReferenceType Reference_ID 
1 1   book   1 
2 1   article  1 
3 1   article  2 
4 1   book   2 

その後、あなたはWHILEループを回避し、MySQLがとあなたのための作業に参加するやらせることができます。

SELECT CONCAT('record ', rt.ID, ': ', 
    COALESCE(ar.Article_Title, tr.Thesis_Title, br.Book_Title)) 
FROM ref_types rt 
LEFT JOIN article_refs ar 
    ON rt.ReferenceType = 'article' AND ar.ID = rt.Reference_ID 
LEFT JOIN book_refs br 
    ON rt.ReferenceType = 'book' AND br.ID = rt.Reference_ID 
LEFT JOIN thesis_refs tr 
    ON rt.ReferenceType = 'thesis' AND tr.ID = rt.Reference_ID 

結果利回り:

record 1: book1 
record 2: article1 
record 3: article2 
record 4: book2 
+0

@teutara、たとえば、記事1の本を挿入するとき。新しいIDを生成するbook_refsに本をauto_incrementを使って挿入します。次に、新しいレコードをref_typesに挿入すると、ReferenceTypeには "book"が挿入され、Reference_IDにはbook_refsの新しいIDが挿入されます。 –

+0

Marcusに感謝しますが、私はReference_ID列に2つのインスタンス1とインスタンス2を2つ持っていることを理解できませんでしたか?それは1、2、3、4ではいけませんか? – teutara

+0

いいえ、Reference_IDはauto_incrementではありません。 ref_types.Reference_IDを他のテーブル(book_refs.ID、thesis_refs.ID、またはarticle_refs.ID)のID値と同じに設定します。 –

0

データをすぐに印刷する代わりに、ref_thesis idに基づいて配列に格納してください。例えば$dataアレイ内の行がref_thesis表にidに基づく順序であろう方法

$data = array(); 

$sql=mysql_query("SELECT * FROM reftypes 
WHERE $article_ID=Article_ID ORDER BY ID ASC"); 
while($row = mysql_fetch_array($sql)){ 
$counter=1; 

if($row[2]=="thesis"){ 
    $sqlthesis=mysql_query("SELECT * FROM ref_thesis 
    WHERE $article_ID=Article_ID 
    ORDER BY ID ASC"); 
    while($thesis_row = mysql_fetch_array($sqlthesis)){ 
     $data[ $row['id'] ] = $row; 
    } 
}elseif..... 

しかし、私はあなたが戻って、あなたが持っているdbスキーマについて考えるべきだと言いました。 whileループの中でdbにクエリを出すのではなく、単一のクエリで単純なJOIN文を使ってほしいものを得ることができるはずです

+0

scibuffさん、ありがとうございます。私はそれをキャッチできませんでした.. btw、あなたは初心者を理解しています。 – teutara

関連する問題