我有一个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"]."'";
将显示以下内容:
我正在尝试获取一个查询,该查询只显示具有不同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的一些东西但我无法让它正常工作,因为我没有那么多经验。如果您还有其他问题,请在评论中询问。任何帮助都会很棒!
答案 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注入攻击,不要只是将用户数据未经检查传递到数据库。