2017-03-06 91 views
0

我的表名稱是菜單列表,如下所示。我的SQL查詢獲取唯一記錄

Health_interest_id menu_id 
    ------------------- ------- 
    4      4 
    4      10 
    5      10 
    2      4 
    2      10 
    2      15 
    2      16 
    1      4 

現在我想結果只有一樣不條記錄之前拿到..

舉例來說,在第一行,我們可以看到health_id = 4,menu_id = 4。使得行shuld被取出,

然後,在第二行中,我們可以看到health_id = 4,其已經存在於上述行,所以跳過該行,

相同第三行,menu_id = 10,其可以在上面的recore中找到,所以跳過這個,並且繼續所有的行。意味着如果結果出現之前跳過。

+1

您使用的是MySQL還是MS SQL Server?不要標記不涉及的產品。 – jarlh

+5

SQL表格代表*無序*集合。沒有「第一行」或「以上」的內容,除非您指定了排序。你的表是否有按列中的值指定的順序? –

+0

'與第3行相同,menu_id = 10在上面的記錄中可用,所以跳過並繼續所有行。意思是如果結果得到,則跳過。「既然你說第二行應該跳過,我們應該跳過第三行(即第二行)。請澄清你的要求。 –

回答

0

嗯。如果你只是想在兩列中的不同值,你可以這樣做:

select Health_interest_id as menu_id from menulist 
union 
select menu_id from menulist; 

這是否實現你想要的?

0

你真的真的應該把這種邏輯從數據庫引擎中移出來,因爲它並不是用來進行上下文感知的選擇。你打破了關係數據的概念。這裏說的是一個解決方案,從來沒有人應該以任何理由使用這種解決方案。我應該被解僱,並且我的學位被撤銷並禁止用於寫作的計算器。但我覺得很有趣。你不敢用它)。

SELECT Health_interest_id, menu_id from 
(
    SELECT 
     t2.*, 
     @s:=CASE WHEN @t <> "" AND @u <> "" THEN CONCAT(@s,@t,@u) ELSE @s END, 
     @t:=CASE WHEN LOCATE(CONCAT("|", Health_interest_id, "|"),@s) = 0 THEN CONCAT(Health_interest_id, "|") else "" END as AisNew, 
     @u:=CASE WHEN LOCATE(CONCAT("|", menu_id, "|"),@s) = 0 THEN CONCAT(menu_id, "|") else "" END as BisNew 
    FROM 
     Temp.t2 as t2, 
     (Select @s:="|") as s, 
     (Select @t:="") as t, 
     (Select @u:="") as u 
) AS INNER_TAB 
WHERE AisNew <> "" And BisNew <> ""; 
+0

表名在哪裏? –

+0

因爲我沒有表名,所以我調用表Temp.t2。 – gbtimmon