Mysql,在多个表中搜索

Mysql,在多个表中搜索,mysql,Mysql,我正在开发一个异步游戏,但我对MySQL和PHP完全陌生。我有两个表,tb_用户和tb_匹配。第一个存储所有用户及其状态(例如,“状态”列中的值为0表示玩家处于待机状态,而值为1表示玩家正在等待对手进行比赛) tb_matches表存储所有匹配,包括活动和非活动(完成)匹配。此表中有两列具有玩家ID 我试图做的是搜索可用的对手,这必须满足以下要求: 1) 它在tb_用户表中的状态必须为1 2) 它不能已经与搜索新对手的用户进行了活动匹配 我试过: SELECT * FROM tb_users

我正在开发一个异步游戏,但我对MySQL和PHP完全陌生。我有两个表,tb_用户和tb_匹配。第一个存储所有用户及其状态(例如,“状态”列中的值为0表示玩家处于待机状态,而值为1表示玩家正在等待对手进行比赛)

tb_matches表存储所有匹配,包括活动和非活动(完成)匹配。此表中有两列具有玩家ID

我试图做的是搜索可用的对手,这必须满足以下要求:

1) 它在tb_用户表中的状态必须为1 2) 它不能已经与搜索新对手的用户进行了活动匹配

我试过:

SELECT * 
FROM tb_users
JOIN tb_matches
WHERE tb_users.status = "1"
AND tb_matches.player1 != '".$username."'
AND tb_matches.player2 != '".$username."'
…但这不会给我任何结果。此外,还应考虑到tb_matches表中可能根本没有匹配项

有什么帮助吗?还有,有没有更好的方法来完成这项任务?

试试这个(注意,您必须用“用户名”代替实际用户名)

SELECT * 
FROM
    `tb_users`
WHERE
    `tb_users`.`status` = "1"
AND
    `tb_users`.`name` NOT IN (
        SELECT `player1` FROM `tb_matches` WHERE `player2` = 'username'
        UNION
        SELECT `player2` FROM `tb_matches` WHERE `player1` = 'username'
        UNION
        SELECT 'username'
    )

考虑以下替代表结构:

tb_users
---------
id
name
seeking


tb_user_matches
---------------
match_id
player_id


tb_matches
----------
id
started
ended
status
  • 添加第三个(多对多)表来存储哪些玩家参与了哪场比赛,这样可以进行更简单的查询,见下文
  • tbu用户
    中的“状态”更改为“查找”,这样布尔数据类型才有意义
  • 不要将球员姓名存储在tb_matches中,存储他们的ID。(允许在不中断链接的情况下更改姓名()。)
  • 考虑将日期时间字段添加到
    tb_matches
    以存储匹配的开始和结束日期;它将来可能会有用
  • tbu matches
    中的“status”(状态)列可以指示三种比赛状态:等待更多球员、进行中或完成(见下文)
使用此结构,您可以使用以下查询查找以下玩家:

  • 搜索匹配项(搜索=1)
  • 还没有在等待玩家的比赛中

我建议进行tb_匹配。状态可能为“0”表示不活动(等待玩家),“1”表示活动,而“2”表示已完成

这并不一定检查玩家是否已经参与了一场活动比赛。也许你的游戏允许玩家同时参加多场比赛?如果没有,您可以更改查询以排除活动的匹配项(将
m.status=0
更改为
m.status!=2

编辑:

用英语解释问题(尽我所能):

从用户表中选择用户id和名称。包括匹配状态为“0”(等待)的用户参与的匹配。(如果用户未参与任何状态为“0”的匹配,则左连接将使匹配id为空(null)。)


现在,从这组数据中,只显示正在搜索(
u.seeking=1
)且未处于等待匹配状态(
um.match\u id为NULL
)的用户。

尝试运行mysql-thru,查看其结构是否正确,然后解决问题!你能把每个表中的列都显示出来吗?例如,在您的
tb\u matches
表中,哪个列存储活动/非活动状态?您不能将别名放在
后面而不是
,AFAIK。您需要将子查询放在那里。您不能引用这样的别名。别名不是视图。不,逻辑是可以的,但使用子查询时速度非常慢。。。Mysql真的是sux…太棒了:D我还是讨厌Mysql:D你能解释一下吗?就是这样!我只需将此
WHERE Username='Username'
更改为此
WHERE Username!='用户名“
我认为这不起作用。。。你能给我解释一下这个算法吗?是的,它一直在工作,直到我添加了一个与另一对用户的新匹配项(ID与“username”不同)。现在它不工作了。非常感谢你,我会试试的。
tb_users
---------
id
name
seeking


tb_user_matches
---------------
match_id
player_id


tb_matches
----------
id
started
ended
status
SELECT u.id, u.name
FROM tb_users u
    LEFT JOIN tb_user_matches um
        JOIN tb_matches m
        ON um.match_id = m.id AND m.status = 0
    ON u.id = um.player_id
WHERE u.seeking = 1
AND um.match_id IS NULL;