2013-11-28 207 views
0

我已經陷入這個問題,我不完全確定我應該如何實現我的查詢。需要幫助查詢邏輯

我有兩個表,一個是的文章和一個所謂的ATC代碼

ATC代碼如下所示:N02AA59。這是一個完整代碼consisiting的7個字符。最後一個字符之前的每個字符都是某個類別。因此N02A也是ATC代碼。

現在我的文章表包含遠離所有ATC代碼。 我想要實現的是一個用於自動完成的結果集,以這種方式,所有ATC子代碼(char 1-6)都應該是結果集的一部分,只要 - 並且只有在它們導致達到一篇ATC代碼的文章以我的文章表中的那些字符開頭。例如,如果我在自動填充中鍵入「N02A」,那麼應該成爲結果集一部分的項目都是以「N02A」開頭的ATC代碼,因爲我們有一篇文章的ATC代碼爲「 N02AA59" 。

這是基本的查詢,但正如你可能已經猜到,它只返回7焦炭ATC代碼,因爲在我的文章表中不存在短ATC代碼:

SELECT _atc_codes.code, _atc_codes.name 
FROM articles 
JOIN _atc_codes 
ON (_atc_codes.code LIKE 'N02A%' AND _atc_codes.id = articles.atc_code) 

有一個轉折整個查詢。第二列,即相應的名稱字段,必須是ATC編碼的字段。因此,如果我搜索「N02A」,這並不意味着每個項目都應該有ATC代碼「N02A」的名稱。

+0

您是否嘗試過使用'SUBSTR'功能?它可能可以幫助你http://sql.sh/fonctions/substring – AlexB

+0

使用返回不同長度的SUBSTR的查詢的UNION。 – Barmar

+0

對不起,我不明白你在做什麼,但是關於層次結構的事情不是嗎?例如,搜索N02AB(N02A)應該引發QN02AB53(芬太尼組合,右) – Strawberry

回答

0

我設法自己解決了這個問題。此查詢完全給出了我後面的結果集:

SELECT `filtered`.code AS `value`, `filtered`.en AS `name` 
FROM (SELECT _atc_codes.code, _atc_codes.en 
     FROM _atc_codes 
     WHERE _atc_codes.code LIKE 'N02A%') AS `filtered` 
JOIN (SELECT _atc_codes.code 
     FROM articles 
     JOIN _atc_codes 
     ON (_atc_codes.id = articles.atc_code) 
     GROUP BY articles.atc_code) AS `articles` 
WHERE articles.code LIKE CONCAT(`filtered`.code, '%') 
GROUP BY `filtered`.code 

關鍵是比較兩個派生表,而不是連接兩個完整表。

+0

幹得好 - 雖然在沒有任何聚合函數的情況下,您使用GROUP BY是不合適的。也許你在使用DISTINCT運算符。 – Strawberry

+0

@Strawberry感謝您的回覆。你認爲「GROUP BY」和「DISTINCT」的區別是什麼?在這種特殊情況下性能有何提升? – silkfire

+0

是的,加上GROUP BY可以(並且會)在選擇多列的情況下導致不可預測的結果( - 在這種情況下更少的問題) – Strawberry

0

從你的問題的細節,我假設你有兩個表。
表1:_atc_codes與字段代碼名稱(可能更多)。
表2:文章與字段atc_code和其他字段,包括文章(這不是空的)。
我用這個最小的信息做了一個測試,除了一個小錯誤,你的查詢工作。 在查詢行ON (_atc_codes.code LIKE 'N02A%' AND _atc_codes.id = articles.atc_code)您比較_atc_codes.idarticles.atc_code
應該_atc_codes.code,而不是_atc_codes.id

請評論,如果有關於其他詳細信息_atc_codes.id這是從原來的帖子丟失或如果我錯了。