Table Name: entries
ID (int)
rootID (int)
categoryID (int)
editDate (dateTime [ default null ])
createdDate (dateTime [ default NOW() ])
+--+--------+----------+---------------------+---------------------+
|ID| rootID |categoryID| editDate | createdDate |
+--+--------+----------+---------------------+---------------------+
| 1| 1 | 1 | 2018-05-02 18:59:01 | 2018-04-01 18:52:37 |
| 2| 1 | 1 | null | 2018-05-02 18:59:01 |
| 3| 3 | 1 | 2018-06-10 19:32:01 | 2018-06-10 19:12:01 |
| 4| 3 | 1 | 2018-07-11 18:52:01 | 2018-06-10 19:32:01 |
| 5| 3 | 1 | null | 2018-07-11 18:52:01 |
| 6| 6 | 1 | 2018-10-09 12:38:01 | 2018-10-09 12:27:01 |
| 7| 6 | 1 | null | 2018-10-09 12:38:01 |
| 8| 8 | 2 | 2018-11-09 08:12:11 | 2018-12-09 10:12:01 |
| 9| 8 | 2 | null | 2018-11-09 08:12:11 |
+--+--------+----------+---------------------+---------------------+
您好,我正在尝试从具有这种结构的表中选择信息。我需要从所有rootID返回类别1中的所有行,但仅在editDate为null的情况下,并且也仅从每个rootID返回min(createdDate)的地方。
我希望得到第2、5和7行的结果。但是,如果将ID [4]的editDate值替换为NULL,那么对于rootID 3,必须返回ID 4而不是5。
我一直在寻找类似的帖子,我发现的最接近的帖子是:
SQL MIN Function with where clause
我觉得我与在其中找到的示例之一很接近,但是它们使用的是两个表,我只需要使用一个表。这是我现在正在尝试的方法:
SELECT * FROM entries e WHERE e.categoryID=1 AND e.editDate is NULL AND e.createdDate in(SELECT min(createdDate) FROM entries)
但是,这仅从第一个rootID的最早创建日期起返回一个条目。我在理解查询时遇到了麻烦,但是我开始看到它仅是指一个条目。
我要寻找的是从categoryID = 1,找到每个具有不同的rootID的ID,这些ID的创建日期最早,行的编辑日期为NULL。如何更改此值以从每个根返回一个?谢谢大家的宝贵时间。我将继续发布今晚尝试的SQL。
最佳答案
您的示例的问题在于,它仅选择了createdDate与整个表中最小的createdDate相匹配的行。这就是SELECT min(createdDate)FROM条目所要做的,仅返回一个createdDate。
我认为您需要做的是找到一种方法,为每个给定的rootId选择最小的createdDate。我会尝试这样的事情:
SELECT *
FROM entries A
WHERE A.categoryId = 1
AND A.editDate IS NULL
AND A.createdDate = (SELECT MIN(B.createdDate)
FROM entries B
WHERE A.rootId = B.rootId
AND B.categoryId = 1
AND B.editDate IS NULL);
这样,您从categoryId为1的表中选择,editDate为null,并且createdDate匹配categoryId = 1,editDate为null的所有行的最小createdDate,并且rootID与外部行的匹配查询正在查看。
关于mysql - 选择多个唯一类别ID的最新条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51778368/