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,如果您在理解上仍然有问题,请返回并重新阅读我的评论和相关内容。