2012-01-23 70 views
0

我嘗試根據提供的文章列表創建一個小商店 - 通常沒有問題。 但此列表中有文章,其中有新文章編號的較新版本。例如:Mysql Query查找文章關注者/最後沒有關注者

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); } 
} 

你覺得呢?

+1

如果在搜索和搜索之間有很多文章,您期望輸出什麼?在實際導出文件中的 – piotrm

+0

是最多4篇文章的鏈(例如,1001> 1003> 1011> 1028,但可能在不久的將來再添加一個新版本......),那裏系統對此類後續文章 – user1164709

+0

但是你期待一個更新的文章或只是最後一個的整個列表? – piotrm

回答

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解決方案 - 是的,遞歸的方法在語言中允許它更容易編碼鄰接列表,也更容易閱讀和維護,性能不應該成爲問題,因爲不會有很多新版本的任何物品。

+0

感謝piotrm爲你的代碼示例 - 它看起來非常好);但是我認爲它離我的知識太遠,以至於不能接受它... - 我會試一試,並希望它可以工作 – user1164709

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次最新的用戶實際提供的單篇文章。由於這是一個自聯接,它只會返回一條記錄並且速度很快。從那以後,它將最後一個記錄與關於該匹配查找的文章表加入,以獲得「最新」條目。

+0

這是一個好主意,但它是一個有限的解決方案 - 正如我之前提到的那樣,已經有4篇文章的歷史。如果這些文章獲得新版本,此解決方案將無法工作...... – user1164709