我尝试根据提供的文章列表建立一个小商店 - 通常没问题。 但是此列表中有文章,其中包含具有新文章编号的较新版本。例如:
Article Nr. | Title | Price | New Article
1001 | Test 1 | 10.0 | 1003
1002 | Test 2 | 20.0 |
1003 | Test 3 | 13.0 | ( = new Version of Test 1)
用户应该能够搜索所有文章编号以获得标题&价钱。如果他输入“旧”号码1001,他应该得到标题&新版本的价格:1003。(但这只是一个简单的例子,它不限制在搜索的文章和最终文章之间有多少篇文章)
在我在php中编写一个复杂的解决方案之前,我想询问是否有一种“更简单”的方法来获取带有特殊数据库选择的正确文章?
-
只是想一下下面的(汇总的)php代码是否比请求的mysql查询容易得多:
function searcharticle(search_nr){
SELECT nr, title, price, newnr FROM articles WHERE nr = '$search_nr';
if(empty($newnr)){ $title = ... }else{ searcharticle($newnr); }
}
你怎么看?
答案 0 :(得分:0)
在mysql中管理分层数据并不是一件容易的事,但它是可能的。
假设articles
表有article_num, Title, Price, new_article
列,所有列都是VARCHAR类型,new_article是最新版本的空字符串,这应该可以找到最新版本的标题和价格文章:
SELECT a.Title, a.Price FROM articles a
JOIN
( SELECT
@article_num as prev_version,
@article_num :=
( SELECT new_article
FROM articles
WHERE article_num = prev_version ) AS article_num
FROM
( SELECT @article_num := '1001' ) AS starting_num,
articles
WHERE @article_num <> '' ) newer_articles
ON newer_articles.prev_version = a.article_num
AND newer_articles.article_num = ''
关于你的php解决方案 - 是的,一种语言的递归方法允许它更容易编码邻接列表,也更容易阅读和维护和性能应该不是一个问题因为没有那么多新的任何文章的版本。
答案 1 :(得分:0)
这至少应该有助于在续订项目的层次结构上达到最多4级......
select
Articles.*
from
( select
IF( a4.ArticleNr is not null, a4.ArticleNr,
IF( a3.ArticleNr is not null, a3.ArticleNr,
IF( a2.ArticleNr is not null, a2.ArticleNr, A1.ArticleNr ))) as FinalArticle
from
Articles a1
left join Articles a2
on a1.NewArticle = a2.ArticleNr
left join Articles a3
on a2.NewArticle = a3.ArticleNr
left join Articles a4
on a3.NewArticle = a4.ArticleNr
where
a1.ArticleNr = '1001' ) QualifiedArticle
JOIN Articles
ON QualifiedArticle.FinalArticle = Articles.ArticleNr
嵌套的IF(IF(IF()))将从第4代深度“最新”版本文章开始......如果找到,它会得到,否则,获得第3个最新,到第2个最新的单个文章用户实际提供。由于这是一个自联接,它只返回一个记录并且非常快。从那以后,它将最后一条记录与THAT MATCHED上的文章表联系起来,以获得“最新”条目。