【问题标题】:select using sub select使用子选择选择
【发布时间】:2021-07-25 13:04:03
【问题描述】:

我有一个包含统计信息的表格,其中每一行包括 player_id、game_id 和 team_id。我正在尝试创建一个查询以返回结果,其中返回不同的游戏,其中两个或多个玩家在同一团队的游戏中一起玩。我试图创建一个这样的选择语句,但显然这是错误的。

SELECT * FROM (
 SELECT * FROM stats AS t1 WHERE player_id IN (array)
 ) AS t2 
WHERE t1.game_id=t2.game_id AND t1.team_id=t2.team_id

【问题讨论】:

  • 这个问题和PHP有什么关系?您能否根据您的数据提供一些数据和示例结果?
  • 对不起,我会尝试删除 PHP 标记

标签: php mysql


【解决方案1】:

如果您的表有 id,您可以将此 sql 与 INNER JOIN

一起使用
SELECT t1.*,t2.*
FROM stats t1
INNER JOIN stats t2 
  ON  t1.game_id=t2.game_id 
  AND t1.team_id=t2.team_id 
  AND t2.id <> t1.id
WHERE t1. player_id IN (array);

您可以将 SELECT 修改为 SELECT DISTINCT t1.game_id

这是我的表格结果:

MariaDB [Bernd]> SELECT * FROM softball_stats;
+-------------+-----------+---------+---------------+
| sb_stats_id | player_id | game_id | sb_stats_team |
+-------------+-----------+---------+---------------+
|           1 |       100 |       1 |          1000 |
|           2 |       100 |       2 |          1000 |
|           3 |       100 |       3 |          1010 |
|           4 |       101 |       2 |          1000 |
|           5 |       102 |       3 |          1010 |
|           6 |       103 |       1 |          1000 |
+-------------+-----------+---------+---------------+
6 rows in set (0.01 sec)

MariaDB [Bernd]> 
MariaDB [Bernd]> SELECT t1.*,t2.*
    -> FROM softball_stats t1
    -> INNER JOIN softball_stats t2 
    ->   ON  t1.game_id=t2.game_id 
    ->   AND t1.sb_stats_team=t2.sb_stats_team 
    ->   AND t2.sb_stats_id <> t1.sb_stats_id
    -> WHERE t1. player_id IN (100,101);
+-------------+-----------+---------+---------------+-------------+-----------+---------+---------------+
| sb_stats_id | player_id | game_id | sb_stats_team | sb_stats_id | player_id | game_id | sb_stats_team |
+-------------+-----------+---------+---------------+-------------+-----------+---------+---------------+
|           4 |       101 |       2 |          1000 |           2 |       100 |       2 |          1000 |
|           2 |       100 |       2 |          1000 |           4 |       101 |       2 |          1000 |
|           3 |       100 |       3 |          1010 |           5 |       102 |       3 |          1010 |
|           1 |       100 |       1 |          1000 |           6 |       103 |       1 |          1000 |
+-------------+-----------+---------+---------------+-------------+-----------+---------+---------------+
4 rows in set (0.01 sec)

MariaDB [Bernd]> 

【讨论】:

  • 谢谢,我认为我没有为表分配 id。每行都有一个主键。我需要为整个表分配一个 id,还是为每列分配一个 id,或者两者都分配?
  • 没关系,我使用了行 ID 并且查询通过了。唯一的问题是它返回了任何一名球员参加的每场比赛,而不仅仅是他们都参加过/参加过的比赛和球队。它应该返回一个非常小的集合,可能是数千条记录中的 2 或 3 个结果。
  • @Jim - 您能否在sqlfiddle.com 上发布表的创建和一些示例数据,然后发布链接。我认为你不必有一个 id 字段来更改 id tho 你的主键 feldname 的名称。它只是将组合隐藏到它自己
  • sqlfiddle.com 网站不适合我。达不到。这是我的表的缩写创建语句 -- phpMyAdmin SQL Dump -- 版本 4.9.5 -- 服务器版本:5.6.41-84.1 -- PHP 版本: 7.3.27 -- 表softball_stats 的表结构@ CREATE TABLE @ 987654325@ ( sb_stats_id int(11) NOT NULL, player_id int(3) NOT NULL, game_id int(3) NOT NULL, sb_stats_team int(4) DEFAULT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=拉丁语1;
  • -- 表 softball_stats 的索引 -- ALTER TABLE softball_stats ADD PRIMARY KEY (sb_stats_id), ADD KEY player_id (player_id), ADD KEY sb_stats_team (@ 987654336@), 添加密钥game_id (game_id); -- -- 转储表的AUTO_INCREMENT -- -- 表softball_stats的AUTO_INCREMENT -- ALTER TABLE softball_stats MODIFY sb_stats_id int(11) NOT NULL AUTO_INCREMENT; --
猜你喜欢
  • 2017-11-01
  • 2021-05-15
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多