CakePHP 3 - 如何在 IN 条件下使用子查询?
CakePHP 3 - How do I use subquery in IN condition?
我必须构建以下查询,但对 select max() 部分没有想法。
有这两个表:
玩家
-------------
| id | name |
-------------
| 1 | AAAA |
-------------
| 2 | BBBB |
-------------
分数
----------------------------------------
| player_id | score | created |
----------------------------------------
| 1 | 1080 | 2015/12/28 15:38 |
----------------------------------------
| 1 | 1199 | 2015/12/28 16:00 |
---------------------------------------|
| 2 | 2400 | 2015/12/29 10:30 |
----------------------------------------
| 2 | 2420 | 2015/12/29 10:41 |
----------------------------------------
| 2 | 2031 | 2015/12/29 11:12 |
----------------------------------------
我想要的结果:
----------------------------
| id | name | latest_score |
----------------------------
| 1 | AAAA | 1199 |
----------------------------
| 2 | BBBB | 2031 |
----------------------------
SQL 查询 #1 - 这个查询给出了我想要的上述结果
SELECT
players.id AS id,
players.name AS name,
scores.player_id,
scores.score AS latest_score,
scores.created
FROM
players
JOIN scores ON
players.id = scores.player_id
WHERE
scores.created IN(
SELECT MAX(scores.created)
FROM
scores
WHERE
scores.player_id= player.id
)
SQL 查询 #2 - 由 @tim-biegeleisen 提供,也有效,所以或者你可以帮助我构建此查询?
SELECT p.id, p.name, s1.score AS latest_score
FROM players p INNER JOIN scores s1
ON p.id = s1.player_id
INNER JOIN
(
SELECT s.player_id, MAX(s.created) AS latest
FROM scores s
GROUP BY s.player_id
) s2
ON s1.player_id = s2.player_id AND s1.created = s2.latest
目前正在尝试构建类似的东西:
$query = $this->Players->find()
->select([
"Players.id",
"Players.name",
"Scores.scores",
"Scores.created"
])
->join([
"Scores" => [
"table" => "scores",
"type" => "left",
"conditions" => "Players.id = Scores.player_id"
]
])
->where([
"Scores.created" =>
$this->Players->Scores->find()
->select(["MAX(Scores.created)"])
->where(["Scores.player_id = Players.id"])
]);
问题 是,此构建器不起作用:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL语法;查看与您的 MariaDB 服务器版本对应的手册,了解在第 1
行 'MAX(`Scores__created`) FROM scores Scores WHERE Scores.player_id = Players.i' 附近使用的正确语法
我不想只构建一个连接,然后订购 Scores.created
desc,然后获取 [0]
以获得第一行。你知道如何构建这个查询吗?请帮忙。
谢谢!
我不是 CakePHP 专家,但我可以为您提供以下连接查询,它避免了 WHERE
子句中的子查询。也许这会帮助您找到解决您遇到的问题的方法。
SELECT p.id, p.name, s1.score AS latest_score
FROM players p INNER JOIN scores s1
ON p.id = s1.player_id
INNER JOIN
(
SELECT s.player_id, MAX(s.created) AS latest
FROM scores s
GROUP BY s.player_id
) s2
ON s1.player_id s2.player_id AND s1.created = s2.latest
尝试使用 CakePHP SQL 函数语法:
$subquery = $this->Players->Scores->find();
$query = $this->Players->find()
->select([
"Players.id",
"Players.name",
"Scores.scores",
"Scores.created"
])
->join([
"Scores" => [
"table" => "scores",
"type" => "left",
"conditions" => "Players.id = Scores.player_id"
]
])
->where([
"Scores.created" => $subquery
->select([$subquery->func()->max('Scores.created')])
->where(["Scores.player_id = Players.id"])
]);
您可以阅读有关 CakePHP 3 的 ORM SQL 函数的文档 here.
我必须构建以下查询,但对 select max() 部分没有想法。
有这两个表:
玩家
-------------
| id | name |
-------------
| 1 | AAAA |
-------------
| 2 | BBBB |
-------------
分数
----------------------------------------
| player_id | score | created |
----------------------------------------
| 1 | 1080 | 2015/12/28 15:38 |
----------------------------------------
| 1 | 1199 | 2015/12/28 16:00 |
---------------------------------------|
| 2 | 2400 | 2015/12/29 10:30 |
----------------------------------------
| 2 | 2420 | 2015/12/29 10:41 |
----------------------------------------
| 2 | 2031 | 2015/12/29 11:12 |
----------------------------------------
我想要的结果:
----------------------------
| id | name | latest_score |
----------------------------
| 1 | AAAA | 1199 |
----------------------------
| 2 | BBBB | 2031 |
----------------------------
SQL 查询 #1 - 这个查询给出了我想要的上述结果
SELECT
players.id AS id,
players.name AS name,
scores.player_id,
scores.score AS latest_score,
scores.created
FROM
players
JOIN scores ON
players.id = scores.player_id
WHERE
scores.created IN(
SELECT MAX(scores.created)
FROM
scores
WHERE
scores.player_id= player.id
)
SQL 查询 #2 - 由 @tim-biegeleisen 提供,也有效,所以或者你可以帮助我构建此查询?
SELECT p.id, p.name, s1.score AS latest_score
FROM players p INNER JOIN scores s1
ON p.id = s1.player_id
INNER JOIN
(
SELECT s.player_id, MAX(s.created) AS latest
FROM scores s
GROUP BY s.player_id
) s2
ON s1.player_id = s2.player_id AND s1.created = s2.latest
目前正在尝试构建类似的东西:
$query = $this->Players->find()
->select([
"Players.id",
"Players.name",
"Scores.scores",
"Scores.created"
])
->join([
"Scores" => [
"table" => "scores",
"type" => "left",
"conditions" => "Players.id = Scores.player_id"
]
])
->where([
"Scores.created" =>
$this->Players->Scores->find()
->select(["MAX(Scores.created)"])
->where(["Scores.player_id = Players.id"])
]);
问题 是,此构建器不起作用:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL语法;查看与您的 MariaDB 服务器版本对应的手册,了解在第 1
行 'MAX(`Scores__created`) FROM scores Scores WHERE Scores.player_id = Players.i' 附近使用的正确语法我不想只构建一个连接,然后订购 Scores.created
desc,然后获取 [0]
以获得第一行。你知道如何构建这个查询吗?请帮忙。
谢谢!
我不是 CakePHP 专家,但我可以为您提供以下连接查询,它避免了 WHERE
子句中的子查询。也许这会帮助您找到解决您遇到的问题的方法。
SELECT p.id, p.name, s1.score AS latest_score
FROM players p INNER JOIN scores s1
ON p.id = s1.player_id
INNER JOIN
(
SELECT s.player_id, MAX(s.created) AS latest
FROM scores s
GROUP BY s.player_id
) s2
ON s1.player_id s2.player_id AND s1.created = s2.latest
尝试使用 CakePHP SQL 函数语法:
$subquery = $this->Players->Scores->find();
$query = $this->Players->find()
->select([
"Players.id",
"Players.name",
"Scores.scores",
"Scores.created"
])
->join([
"Scores" => [
"table" => "scores",
"type" => "left",
"conditions" => "Players.id = Scores.player_id"
]
])
->where([
"Scores.created" => $subquery
->select([$subquery->func()->max('Scores.created')])
->where(["Scores.player_id = Players.id"])
]);
您可以阅读有关 CakePHP 3 的 ORM SQL 函数的文档 here.