2012-03-08 3 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 

내가 테이블 중 하나에 삽입 할 때, 먼저 유형 (book, article)과 함께 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..... 

는 모든 논문의 기록을 나열이 방법은 내가 단순히 때문에 while 루프의 알고

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

.. 문서 테이블 등을 나열하지만, ​​ref_types 테이블이 (같은 순서를 얻는 방법에 대해 설명합니다. .) ??

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

어떤 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

+0

또한 ref_thesis 테이블을 보여주세요, 그리고 테이블 간의 주요 관계. –

+0

안녕 마커스, 위의 것들, 기사 및 도서 테이블과 같은 구조를 가지고 있습니다. 나는 – teutara

+0

을 편집했습니다. 그럼 오타를 바로 잡을거야. –

답변

1

ref_types 테이블에 ReferenceType 열을 추가하는 것 외에 Reference_ID 열도 필요합니다. 해당 테이블의 실제 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에 대한 책을 삽입 할 때. 당신은 auto_increment를 사용하여 새로운 ID를 생성하는 book_refs에 책을 삽입한다. 그런 다음 ref_types에 새 레코드를 삽입 할 때 referenceType에 "book"을 삽입하고 reference_ID에 대해 book_refs에서 새 ID를 삽입합니다. –

+0

Marcus에게 감사하지만, Reference_ID 열에 2의 인스턴스 1과 인스턴스 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 = 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..... 

$data 배열의 행이 ref_thesis 표의 id에 기초하여 순서대로되도록 방법.

그렇긴해도 돌아가서 가지고있는 DB 스키마에 대해 생각해야한다고 생각합니다. 하나의 쿼리에서 몇 개의 간단한 JOIN 문을 사용하여 while 루프 내에서 db를 쿼리하지 않고도 원하는 결과를 얻을 수 있어야합니다.

+0

scibuff .. 주문을 도와주는 배열에 저장됩니다 감사합니다? 나는 그것을 잡을 수 없었다 .. btw, 나는 당신이 초보자를 이해할 때이다 .. – teutara

관련 문제