2017-03-06 96 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