如何从另一个表命令的mysql表中获取值?

时间:2012-03-08 13:56:37

标签: php mysql sql-order-by

我对某篇文章的记录有一些参考。参考可能是文章,书籍,论文等类型。 每个都可能有不同的属性,例如

//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

当我插入其中一个表时,我首先进入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.....

这样它列出了所有论文记录,然后列出了文章表等。

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

任何帮助表示赞赏。 提前谢谢..

2 个答案:

答案 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通过JOIN为您完成工作:

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

答案 1 :(得分:0)

不是立即打印数据,而是将其存储在基于ref_thesis id的数组中。 e.g

$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数组中的行将按照id表中ref_thesis的顺序排列。

那就是说,我认为你应该回过头来考虑你拥有的数据库架构。您应该能够在单个查询中使用一些简单的JOIN语句获得所需内容,而不是在while循环中查询db