Mysql Query查找文章关注者/ last没有关注者

时间:2012-01-23 10:40:46

标签: mysql sql

我尝试根据提供的文章列表建立一个小商店 - 通常没问题。 但是此列表中有文章,其中包含具有新文章编号的较新版本。例如:

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); }
}
你怎么看?

2 个答案:

答案 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上的文章表联系起来,以获得“最新”条目。