适合 where 子句的组中的最大值
Max Value in group that fit where clause
是的,这是另一个每组最伟大的问题之一!我已经尝试了几天,试图解决这个问题,但无济于事。我也一直在寻找,但我什至不知道我是否在正确的地方寻找。问题的最简化版本如下。
我有2个table,一个是多对多,另一个有数据。
--------a------- ------------b-----------
| id | version | | id | version | external_ref |
| 1 | 1 | | 1 | 1 | 9 |
| 1 | 2 | | 1 | 2 | 8 |
| 1 | 3 | | 1 | 3 | 7 |
| 2 | 1 | | 2 | 1 | 5 |
| 2 | 2 | | 2 | 2 | 6 |
. .
. .
. .
这是我当前(大大简化的)查询以获取结果:
SELECT * FROM a
INNER JOIN (
SELECT MAX(Version) FROM a GROUP BY id
) j ON a.id = j.id AND a.version = j.version
LEFT JOIN b ON a.id = b.id AND a.version = b.version
WHERE (b.external_ref = 9
OR b.external_ref = 8 (ect)
) AND (a.id = 1 OR
a.id = 2)
此查询的问题在于,如果 external_ref = 7
不在 where 子句中,则不会返回任何行。
如果我正在查看只有 external_ref
个 8、9 或 5 的条目,那么我希望能够得到以下结果
| id | version | data from table a |
| 1 | 2 | some data from table a |
| 2 | 1 | some more data |
那么如何得到满足where子句的MAX(version)
呢?
完整的查询是:
SELECT DISTINCT `t`.`Version`, `t`.`TermID`, `t`.`Definition`, `t`.`Name`
FROM `term` AS `t`
INNER JOIN (
SELECT MAX(`Version`) version, `TermID`
FROM `term`
GROUP BY `termID`
) jj ON `t`.`TermID` = jj.`TermID` AND `t`.`Version` = jj.`Version`
LEFT JOIN `syllabusin` AS `si` ON `t`.`TermID` = `si`.`TermID` AND `t`.`Version` = `si`.`Version`
LEFT JOIN `synonyms` AS `sy` ON `t`.`TermID` = `sy`.`TermID`
WHERE
(`si`.`SyllabusID` = 7
OR `si`.`SyllabusID` = 6
OR `si`.`SyllabusID` = 5
OR `si`.`SyllabusID` = 4
OR `si`.`SyllabusID` = 3
OR `si`.`SyllabusID` = 2
OR `si`.`SyllabusID` = 1
OR `si`.`SyllabusID` = 8 )
AND ( `t`.`Name` LIKE '%term%'
OR `t`.`Acronym` LIKE '%term%'
OR `t`.`Definition` LIKE '%term%'
OR `sy`.`Synonym` LIKE '%term%' )
编辑:
为了阐明我想要什么,我想从 table a
中获取行,这些行在外部引用(具有 external_ref = x
),其 ID 具有最大版本。
我想可能是这样:
SELECT a.*
FROM a
JOIN (
SELECT a.id, MAX(a.version) AS maxversion
FROM a
JOIN b ON a.id = b.id and a.version = b.version
WHERE b.external_ref IN (9, 8)
GROUP BY a.id
) AS amax ON a.id = amax.id AND a.version = amax.version
也可以这样写:
SELECT a.*
FROM a
JOIN (
SELECT a.id, MAX(a.version) AS maxversion
FROM a
JOIN (SELECT *
FROM b
WHERE external_ref IN (9, 8)) AS b
ON a.id = b.id and a.version = b.version
GROUP BY a.id
) AS amax ON a.id = amax.id AND a.version = amax.version
对于更完整的查询,我认为您只需将所有连接和条件移动到子查询中即可:
SELECT DISTINCT `t`.`Version`, `t`.`TermID`, `t`.`Definition`, `t`.`Name`
FROM `term` AS `t`
INNER JOIN (
SELECT MAX(`Version`) version, `TermID`
FROM `term` AS t
JOIN syllabusin AS si ON `t`.`TermID` = jj.`TermID` AND `t`.`Version` = jj.`Version`
JOIN `synonyms` AS `sy` ON `t`.`TermID` = `sy`.`TermID`
WHERE
(`si`.`SyllabusID` IN (7, 6, 5, 4, 3, 2, 1, 8)
AND ( `t`.`Name` LIKE '%term%'
OR `t`.`Acronym` LIKE '%term%'
OR `t`.`Definition` LIKE '%term%'
OR `sy`.`Synonym` LIKE '%term%' )
GROUP BY `termID`
) jj ON `t`.`TermID` = jj.`TermID` AND `t`.`Version` = jj.`Version`
它的逻辑与之前的查询基本相同:您执行所有条件的连接,并从中获取每个 ID 的最大版本。然后加入原始 table,仅选择与 ID 和最大版本匹配的行。
是的,这是另一个每组最伟大的问题之一!我已经尝试了几天,试图解决这个问题,但无济于事。我也一直在寻找,但我什至不知道我是否在正确的地方寻找。问题的最简化版本如下。
我有2个table,一个是多对多,另一个有数据。
--------a------- ------------b-----------
| id | version | | id | version | external_ref |
| 1 | 1 | | 1 | 1 | 9 |
| 1 | 2 | | 1 | 2 | 8 |
| 1 | 3 | | 1 | 3 | 7 |
| 2 | 1 | | 2 | 1 | 5 |
| 2 | 2 | | 2 | 2 | 6 |
. .
. .
. .
这是我当前(大大简化的)查询以获取结果:
SELECT * FROM a
INNER JOIN (
SELECT MAX(Version) FROM a GROUP BY id
) j ON a.id = j.id AND a.version = j.version
LEFT JOIN b ON a.id = b.id AND a.version = b.version
WHERE (b.external_ref = 9
OR b.external_ref = 8 (ect)
) AND (a.id = 1 OR
a.id = 2)
此查询的问题在于,如果 external_ref = 7
不在 where 子句中,则不会返回任何行。
如果我正在查看只有 external_ref
个 8、9 或 5 的条目,那么我希望能够得到以下结果
| id | version | data from table a |
| 1 | 2 | some data from table a |
| 2 | 1 | some more data |
那么如何得到满足where子句的MAX(version)
呢?
完整的查询是:
SELECT DISTINCT `t`.`Version`, `t`.`TermID`, `t`.`Definition`, `t`.`Name`
FROM `term` AS `t`
INNER JOIN (
SELECT MAX(`Version`) version, `TermID`
FROM `term`
GROUP BY `termID`
) jj ON `t`.`TermID` = jj.`TermID` AND `t`.`Version` = jj.`Version`
LEFT JOIN `syllabusin` AS `si` ON `t`.`TermID` = `si`.`TermID` AND `t`.`Version` = `si`.`Version`
LEFT JOIN `synonyms` AS `sy` ON `t`.`TermID` = `sy`.`TermID`
WHERE
(`si`.`SyllabusID` = 7
OR `si`.`SyllabusID` = 6
OR `si`.`SyllabusID` = 5
OR `si`.`SyllabusID` = 4
OR `si`.`SyllabusID` = 3
OR `si`.`SyllabusID` = 2
OR `si`.`SyllabusID` = 1
OR `si`.`SyllabusID` = 8 )
AND ( `t`.`Name` LIKE '%term%'
OR `t`.`Acronym` LIKE '%term%'
OR `t`.`Definition` LIKE '%term%'
OR `sy`.`Synonym` LIKE '%term%' )
编辑:
为了阐明我想要什么,我想从 table a
中获取行,这些行在外部引用(具有 external_ref = x
),其 ID 具有最大版本。
我想可能是这样:
SELECT a.*
FROM a
JOIN (
SELECT a.id, MAX(a.version) AS maxversion
FROM a
JOIN b ON a.id = b.id and a.version = b.version
WHERE b.external_ref IN (9, 8)
GROUP BY a.id
) AS amax ON a.id = amax.id AND a.version = amax.version
也可以这样写:
SELECT a.*
FROM a
JOIN (
SELECT a.id, MAX(a.version) AS maxversion
FROM a
JOIN (SELECT *
FROM b
WHERE external_ref IN (9, 8)) AS b
ON a.id = b.id and a.version = b.version
GROUP BY a.id
) AS amax ON a.id = amax.id AND a.version = amax.version
对于更完整的查询,我认为您只需将所有连接和条件移动到子查询中即可:
SELECT DISTINCT `t`.`Version`, `t`.`TermID`, `t`.`Definition`, `t`.`Name`
FROM `term` AS `t`
INNER JOIN (
SELECT MAX(`Version`) version, `TermID`
FROM `term` AS t
JOIN syllabusin AS si ON `t`.`TermID` = jj.`TermID` AND `t`.`Version` = jj.`Version`
JOIN `synonyms` AS `sy` ON `t`.`TermID` = `sy`.`TermID`
WHERE
(`si`.`SyllabusID` IN (7, 6, 5, 4, 3, 2, 1, 8)
AND ( `t`.`Name` LIKE '%term%'
OR `t`.`Acronym` LIKE '%term%'
OR `t`.`Definition` LIKE '%term%'
OR `sy`.`Synonym` LIKE '%term%' )
GROUP BY `termID`
) jj ON `t`.`TermID` = jj.`TermID` AND `t`.`Version` = jj.`Version`
它的逻辑与之前的查询基本相同:您执行所有条件的连接,并从中获取每个 ID 的最大版本。然后加入原始 table,仅选择与 ID 和最大版本匹配的行。