0

我有一个 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 尝试了一些事情,但我无法让它正常工作,因为我对此没有太多经验。如果您还有其他问题,请在评论中提出。任何帮助都会很棒!

4

4 回答 4

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
于 2013-03-21T10:10:06.407 回答
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;
于 2013-03-21T10:12:11.760 回答
0

请试试这个

select * from Subscriptions where ID in (Select MAX(ID) from Subscriptions sub WHERE Klant_ID = '".$_GET["ID"]."' group by Mail_ID)

于 2013-03-21T10:19:51.077 回答
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 注入的攻击,不要只是将未经检查的用户数据传递给您的数据库。

于 2013-03-21T10:25:32.617 回答