带有WHERE的SQL DISTINCT子句

时间:2013-03-21 10:04:22

标签: sql distinct where

我有一个MySQL数据库表,在那里我可以看到用户订阅了哪些新闻通讯,它看起来像这样:

ID  Klant_ID Mail_ID Status Datum
2   6        1       test   test
72  6        1       10     20-03-2013
73  6        2       90     20-03-2013
74  6        4       10     20-03-2013
75  6        5       90     20-03-2013
76  8        1       10     20-03-2013
77  8        2       10     20-03-2013
78  8        4       90     20-03-2013
79  8        5       90     20-03-2013
80  6        2       90     21-03-2013
81  6        4       10     21-03-2013

我目前正在使用此SQL查询来选择具有正确Klant_ID的所有行:

"SELECT * FROM Subscriptions WHERE Klant_ID = '".$_GET["ID"]."'";

将显示以下内容:

enter image description here

我正在尝试获取一个查询,该查询只显示具有不同Mail_ID的行,而只显示最后一行。基本上我想要一个显示此输出的查询:

ID Klant_ID Mail_ID Status Datum
72 6        1       10     20-03-2013
80 6        2       90     21-03-2013
81 6        4       10     21-03-2013
65 6        5       90     20-03-2013

我已经尝试过使用DISTINCT的一些东西但我无法让它正常工作,因为我没有那么多经验。如果您还有其他问题,请在评论中询问。任何帮助都会很棒!

4 个答案:

答案 0 :(得分:1)

这应该这样做,取决于你的DBMS

SELECT MAX(ID), Mail_ID FROM Subscriptions
    WHERE Klant_ID = '".$_GET["ID"]."' GROUP BY Mail_ID

然后你有正确的ID,你可以通过

获得更多信息
SELECT * FROM Subscriptions,
    (SELECT MAX(ID) as ids, Mail_ID FROM Subscriptions
        WHERE Klant_ID = '".$_GET["ID"]."' GROUP BY Mail_ID) table2
    WHERE ID=table2.ids

答案 1 :(得分:0)

您没有指定DBMS,因此这是ANSI SQL:

select id, 
       klant_id,
       mail_id, 
       status,
       datum
from (
  select id, 
         klant_id,
         mail_id, 
         status,
         datum,
         max(datum) over (partition by mail_id) as max_datum
   from Subscriptions 
   where Klant_ID = 42 --- pass your parameter here
) t
where datum = max_datum;

答案 2 :(得分:0)

请尝试这个

从订阅中选择*其中ID为(从订阅子中选择MAX(ID)WHERE Klant_ID ='"。$ _ GET [" ID"]。"&# 39; group by Mail_ID)

答案 3 :(得分:0)

Distinct不会为您提供所需的结果,因为它会根据您查询返回的所有数据为您提供不同的行。 因为您可以对具有不同日期和状态的同一个新闻稿进行多次订阅,所以您需要更多地修改您的查询,我认为通过状态和基准进行聚合并通过Mail_ID进行分组可能会有所帮助:

"SELECT
        MAX(ID), Klant_ID, Mail_ID, MAX(Status), MAX(Datum)
    FROM Subscriptions
    WHERE Klant_ID = '".$_GET["ID"]."'
    GROUP BY Mail_ID";

另外两件事,你在Status和Datum列中保存的数据类型可能不同,如果你的数据库变得更复杂,这可能会很麻烦,只需将sql查询字符串与Http-Get-Data连接起来就可能会感觉到可以用于测试,但是你自己容易受到SQL注入攻击,不要只是将用户数据未经检查传递到数据库。