如果父级不为空,是否可以将GROUP行放在一起
我将首先解释数据库:
-----------------------------------------------------
ID | NAME | date | PARENT ID
-----------------------------------------------------
1 | John Doe | 2018-01-12 |
2 | Doe John | 2018-01-12 |
3 | Doe John | 2018-02-12 | 2
4 | Doe John | 2018-03-22 | 2
现在我想要的是获得这样的列表:
--------------------------------------------------------------
ID | NAME | date | PARENT ID
-------------------------------------------------------------
1 | John Doe | 2018-01-12 |
2 | Doe John | 2018-01-12 / 2018-03-22 |
我尝试过这样的事情:
SELECT *, CONCAT(parentID)
FROM names
GROUP BY parentID;
但结果只是那些带有parentID的结果,我想显示没有parentID的那些,并将那些带有parentID的那些分组给ID
答案 0 :(得分:2)
当parentID为null时,您可以使用group by ifnull使用ID
SELECT *, CONCAT(parentID)
FROM names
GROUP BY ifnull(parentID, ID);
答案 1 :(得分:2)
试试这个:
SELECT MAX(dates.id), MAX(dates.name), MAX(dates.date), MAX(a.date)
FROM dates
LEFT JOIN dates a ON a.parentID = dates.id
WHERE dates.parentID IS NULL GROUP BY a.parentID;
您遇到的问题是,您需要一种方法来连接具有与行ID相对应的parentID的行中的数据。使用此查询,我们过滤行以仅显示没有parentID的行,然后获取所有父ID等于当前行ID的行。使用max可确保使用group by进行正确使用,并显示示例中的内容。
答案 2 :(得分:1)
诀窍是使用viewBox
将表连接到表,使用初始表作为父项,将连接表作为子项。
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
dataY = np.array([0,1,2,3,4,5,6,7,8,9])
dataX = np.array([0.1,0.5,0.8,1.2,1.3,1.6,1.9,2.1,2.2,2.5]) #Time values 1h = 1/24
fig, ax = plt.subplots()
def timeformat(x,pos=None):
h = int(x*24.)
m = int((x*24.-h)*60)
return "{:02d}:{:02d}".format(h,m)
ax.xaxis.set_major_formatter(mticker.FuncFormatter(timeformat))
plt.plot(dataX,dataY)
plt.ylabel('Y-Values')
plt.xlabel('Time [hh:mm]')
plt.show()
LEFT JOIN
将保留初始表中的所有行(在本例中为 parents ),只需添加联接表中的行(在这种情况下为 children 如果可以加入,就可以了。但是,只会添加SELECT
*
FROM
users as parents
LEFT JOIN users as children ON parents.id = children.parent_id
个值。
LEFT JOIN
如果这样做,每个父只有一行没有孩子,每个父和孩子,因为父母的孩子存在。
因此,可以使用NULL
列上的| id | name | date | parent_id | id | name | date | parent_id |
| 2 | Doe John | 2018-01-12 | (null) | 3 | Bill John | 2018-02-12 | 2 |
| 2 | Doe John | 2018-01-12 | (null) | 4 | Elmo John | 2018-03-22 | 2 |
| 1 | John Doe | 2018-01-12 | (null) | (null) | (null) | (null) | (null) |
| 3 | Bill John | 2018-02-12 | 2 | (null) | (null) | (null) | (null) |
| 4 | Elmo John | 2018-03-22 | 2 | (null) | (null) | (null) | (null) |
,因为每个子的父都相同父,并且每个父没有孩子存在一行。要过滤来自父母的人,而不是父母,可以添加GROUP BY
子句parents.id
。
WHERE
要根据需要获取parents.parent_id IS NULL
,您必须使用聚合函数MIN()
和MAX()
来计算日期间隔的开始和结束日期。
函数COALESCE()
是必需的,因为SELECT
parents.id
FROM
users as parents
LEFT JOIN users as children ON parents.id = children.parent_id
WHERE
parents.parent_id IS NULL
GROUP BY
parents.id
可能会有date
个值。它将输出第一个提供的参数,即不是NULL
。在此示例中,LEFT JOIN
的结果为NULL
,如果CONCAT
,则NULL
,因此LEAST(...)
返回children.date
。在这种情况下,将使用第二个值MIN(children.date)
。
NULL