如果父字段不为空,则MYSQL组

时间:2018-03-23 14:06:06

标签: mysql concat

如果父级不为空,是否可以将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

3 个答案:

答案 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

Running example on sqlfiddle.com