我有两张桌子:
score_table
列player_id
和score
,其中player_id是唯一的
group_table
列player_id
和group_id
,其中player_id是唯一的。
两个表中有大约1000个条目,group_table.group_id
score_table group_table
____________________ ____________________
| player_id score | |player_id group_id|
| | | |
| 0 200 | | 1 0 |
| 1 1 | | 3 1 |
| 4 0 | | 2 0 |
| 3 114 | | 0 0 |
| 2 9 | | 4 1 |
| ... ... | | ... ... |
| ... ... | | ... ... |
我想选择得分最低的玩家,但必须在group_id 0
基础on this answer,我提出的查询:
SELECT player_id FROM (
SELECT MIN(st.score)
FROM score_table st
INNER JOIN group_table gt
ON gt.player_id = st.player_id
WHERE gt.group_id = 0
ORDER BY st.score ASC
)"
但是,查询构造不正确,结果始终为null
修改
简单" SELECT MAX(st.score) as score FROM score_table pg"
确实返回44,这是正确的最高分。我使用类似的查询测试了所有条目,每个条目都是可检索的。
两个表都使用BTREE作为player_id,这在两种情况下都是唯一的。
修改
"SELECT * FROM score_table as st JOIN group_table gt ON pg.player_id = gt.player_id"
后跟var_dump
输出一个N条目的文件,其中每个条目包含两个表中的列,正确连接在一起
接受答案
所以问题在于表名的别名。
当我们SELECT MIN(st.score)
时,无法使用fetch(PDO::FETCH_NUMERIC)['score']
我必须使用['MIN(st.score)']
作为密钥。
答案 0 :(得分:1)
您的查询有错误,因为子查询没有别名。您应该学习如何检查错误,但是您正在调用查询。
但我认为你想要:
SELECT st.*
FROM score_table st INNER JOIN
group_table gt
ON gt.player_id = st.player_id
WHERE gt.group_id = 0
ORDER BY st.score ASC
LIMIT 1;
您指定要选择分数最小的播放器,而不是最小分数。以上内容会返回score_table
中的所有内容,但您可以选择所需的任何列。
答案 1 :(得分:0)
尝试更改您的查询,如
SELECT MIN(st.score)
FROM score_table st
LEFT JOIN group_table gt
ON gt.player_id = st.player_id
AND gt.group_id = 0;
答案 2 :(得分:0)
如果您想获得分数最低的多个玩家
,您可以使用以下查询joins
如果您只想获得一个播放器,可以将限制1添加到主查询中。
答案 3 :(得分:0)
尝试以下查询:
SELECT st.player_id
FROM score_table st
LEFT JOIN group_table gt
ON gt.player_id = st.player_id
WHERE gt.group_id = 0 and st.score IN (SELECT min(st2.score) FROM score_table st2)
答案 4 :(得分:0)
首先,您要合并score_table
和group_table
。
然后,您只想从组合表中选择group 0
个数据。在排序之后,您想要选择最低分数值。
按照顺序获得结果。
SELECT MIN (st.score) FROM score_table st
INNER JOIN group_table gt
ON st.player_id=gt player_id
WHERE gt.group_id=0;