Php 如何从另一个表排序的mysql表中获取值?

Php 如何从另一个表排序的mysql表中获取值?,php,mysql,sql-order-by,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_Publish

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

//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表及其类型(book,article)。然后插入它所属的表。(例如,如果是物品,则在物品表中插入)

现在,我必须能够按顺序列出引用

$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
循环,但是如何获得这个(与ref_types表相同的顺序)

感谢您的帮助。
提前感谢。

不要立即打印数据,而是基于参考论文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\u论文
表中的
id
的顺序排列


也就是说,我认为您应该回去考虑一下您拥有的db模式。您应该能够在单个查询中通过几个简单的JOIN语句获得所需的内容,而不是在while循环中查询数据库,而不是立即打印数据,而是基于参考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\u论文
表中的
id
的顺序排列


也就是说,我认为您应该回去考虑一下您拥有的db模式。您应该能够在单个查询中通过几个简单的JOIN语句获得所需的内容,而不是在while循环中查询db

除了在ref_types表中具有ReferenceType列之外,还需要一个Reference_ID列,该列将对应表中的实际ID作为一个索引引用

然后,您可以避免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

除了在ref_types表中有ReferenceType列之外,还需要一个Reference_ID列,该列将对应表中的实际ID作为一个索引引用

然后,您可以避免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

谢谢你,巴夫。。存储在阵列中是否有助于我订购?我没能赶上。。顺便说一句,据你所知,我是一个新手,谢谢你。。存储在阵列中是否有助于我订购?我没能赶上。。顺便说一句,我是你所理解的一个新手。@teutara,例如,在为第1条插入一本书时。将书本插入到书本参考中,使用自动增量生成新ID。然后,当您将新记录插入ref_类型时,您将为ReferenceType插入“book”,并为Reference_ID插入book_refs中的新ID。谢谢Marcus,但我不明白如何在Reference_ID列中有两个1实例和两个2实例?不应该是1、2、3、4??不,参考ID不是自动增量。您将ref_types.Reference_ID设置为其他表(book_refs.ID、thesis_refs.ID或article_refs.ID)中的ID值。我确实添加了第二个article_ID,您能对此发表意见吗?@teutara,如果您在理解上仍然有问题,请返回并重新阅读我的评论和阅读。@teutara,例如,为第1条插入书籍时。将书本插入到书本参考中,使用自动增量生成新ID。然后,当您将新记录插入ref_类型时,您将为ReferenceType插入“book”,并为Reference_ID插入book_refs中的新ID。谢谢Marcus,但我不明白如何在Reference_ID列中有两个1实例和两个2实例?不应该是1、2、3、4??不,参考ID不是自动增量。您将ref_types.Reference_ID设置为其他表(book_refs.ID、thesis_refs.ID或article_refs.ID)中的ID值。我确实添加了第二个article_ID,您能对此发表评论吗?@teutara,如果您在理解上仍然有问题,请返回并重新阅读我的评论和相关内容。