MySQL left outer join 相同的 table 多次?
MySQL left outer join the same table multiple times?
所以我有一个MySQL的困境,看似比较简单,其实不然
我有两个 table:一个包含要显示的唯一 ID 列表,另一个 table 在时间戳旁边列出 ID。
====== ============================
| ID | | ID | Timestamp |
====== ============================
| 1 | | 1 | 2015-10-10 00:00:00 |
| 2 | | 1 | 2015-10-10 00:10:00 |
| .. | | 2 | 2015-10-10 00:00:00 |
====== ============================
如果相关 id 在 Table B 两个 Date-Times 之间有记录,我需要显示一个布尔值它上次活跃的日期一直以来。
我试过类似的东西:
SELECT
a.`ID`,
MAX(b1.`Timestamp`) IS NOT NULL as 'Active',
MAX(b2.`Timestamp`) AS 'LastActive'
FROM `Table-A` a
LEFT OUTER JOIN `Table-B` b1
ON a.ID = b1.ID
AND b1.`Timestamp` BETWEEN @startTime AND @endTime
LEFT OUTER JOIN `Table-B` b2
ON a.ID = b2.ID
GROUP BY a.ID
;
目前不确定原因:但查询似乎 运行 无限而且得不到任何结果。任何人都可以建议正确的方法来获得我的查询所需的结果吗?
编辑:
这是上述查询的 EXPLAIN SELECT
。
使用这个
SELECT
a.*,
IF(b1.cnt IS NULL, FALSE, TRUE) AS is_found,
IFNULL(b2.dt, '-') AS max_dt
FROM table1 a
LEFT OUTER JOIN (
SELECT
id,
COUNT(*) AS cnt
FROM table2
WHERE
`timestamp` BETWEEN '2015-01-01' AND '2015-12-31'
GROUP BY 1) b1
ON a.id=b1.id
LEFT OUTER JOIN (
SELECT id,
MAX(TIMESTAMP) AS dt
FROM table2
GROUP BY 1) b2
ON a.id=b2.id
所以我有一个MySQL的困境,看似比较简单,其实不然
我有两个 table:一个包含要显示的唯一 ID 列表,另一个 table 在时间戳旁边列出 ID。
====== ============================
| ID | | ID | Timestamp |
====== ============================
| 1 | | 1 | 2015-10-10 00:00:00 |
| 2 | | 1 | 2015-10-10 00:10:00 |
| .. | | 2 | 2015-10-10 00:00:00 |
====== ============================
如果相关 id 在 Table B 两个 Date-Times 之间有记录,我需要显示一个布尔值它上次活跃的日期一直以来。
我试过类似的东西:
SELECT
a.`ID`,
MAX(b1.`Timestamp`) IS NOT NULL as 'Active',
MAX(b2.`Timestamp`) AS 'LastActive'
FROM `Table-A` a
LEFT OUTER JOIN `Table-B` b1
ON a.ID = b1.ID
AND b1.`Timestamp` BETWEEN @startTime AND @endTime
LEFT OUTER JOIN `Table-B` b2
ON a.ID = b2.ID
GROUP BY a.ID
;
目前不确定原因:但查询似乎 运行 无限而且得不到任何结果。任何人都可以建议正确的方法来获得我的查询所需的结果吗?
编辑:
这是上述查询的 EXPLAIN SELECT
。
使用这个
SELECT
a.*,
IF(b1.cnt IS NULL, FALSE, TRUE) AS is_found,
IFNULL(b2.dt, '-') AS max_dt
FROM table1 a
LEFT OUTER JOIN (
SELECT
id,
COUNT(*) AS cnt
FROM table2
WHERE
`timestamp` BETWEEN '2015-01-01' AND '2015-12-31'
GROUP BY 1) b1
ON a.id=b1.id
LEFT OUTER JOIN (
SELECT id,
MAX(TIMESTAMP) AS dt
FROM table2
GROUP BY 1) b2
ON a.id=b2.id