-3

我知道乍一看标题没有意义。但情况是这样的:数据库表被命名为“teams”。在其中,有一堆用于足球队位置的列(gk1、def1、def2、...、st2)。每列都是 VARCHAR 类型并包含玩家的姓名。还有一列名为“船长”。那一栏的内容(不是最幸运的解决方案)不是船长的名字,而是职位。

因此,如果 'st1' 的内容是 Zlatan Ibrahimovic 并且他是队长,那么 'captain' 的内容是字符串 'st1',而不是字符串 'Zlatan Ibrahimovic'。

现在,我需要编写一个查询,从“teams”表中获取一行,但前提是队长是 Zlatan Ibrahimovic。请注意,此时我不知道他是打 st1、st2 还是其他位置。所以我只需要使用查询中的名字来检查他所扮演的位置是否设置为队长。从逻辑上讲,它看起来像:

if(Zlatan is Captain) 获取行内容

在 MySQL 中,if 条件实际上是 'where' 子句。但是有没有办法写呢?

$query="select * from teams where ???";

“团队”表结构为:

-----------------------------------------------------------------
|   gk1   |   def1  |   def2  | ... |   st2   |     captain     |
-----------------------------------------------------------------
| player1 | player2 | player3 | ... | playerN | captainPosition |
-----------------------------------------------------------------

所有字段都是 VARCHAR 类型。

4

2 回答 2

2

因为captain列的内容是位置而不是名称,而你要根据位置来选择,这很琐碎。

$query="select * from teams where captain='st1'";

修改了以下问题编辑:

您的数据库设计不允许非常有效地完成此操作。您正在查看类似的查询

 SELECT * FROM teams WHERE
    (gk1='Zlatan' AND captain='gk1') OR
    (de1='Zlatan' AND captain='de1') OR
    ...

该设计要求对许多功能进行此类查询:如何在不搜索每个位置的情况下找到特定球员效力的球队?[实际上你可以通过在所有位置的串联中查找名称来做到这一点,但它仍然不是很有效或灵活]

更好的解决方案是规范化您的数据,以便您有一个表格显示哪个玩家在哪里玩:

 Situation
 Team | Player | Posn | Capt
 -----+--------+------+------
    1 |     12 |    1 |    0
    1 |     11 |    2 |    1
    1 |     13 |   10 |    0

...与其他表格一起,您可以识别此处引用的球队、球员和位置。需要进行一些参考检查,以确保每支球队只有一名队长,并且只扮演一名守门员,等等。

然后您可以很容易地看到 Team 1 的队长是 Player 11,他在位置 2 上比赛;或查找球员 11 担任队长的球队(如果有)。

SELECT Name FROM Teams
WHERE Situation.Team = Teams.id
  AND Situation.Capt = 1
  AND Situation.Player = Players.id
  AND Players.Name = 'Zlatan';

对这个想法的改进可能是

 Situation
 Team | Player | Posn | Capt | Playing
 -----+--------+------+------+--------
    1 |     12 |    1 |    0 |       1
    1 |     11 |    2 |    1 |       1
    1 |     13 |   10 |    0 |       0
    1 |     78 |    1 |    0 |       0

...这样你就可以有两名守门员(例如)但只有他们的场上。

重新设计数据库可能需要做很多工作;但它远没有使用现有设计那么复杂或麻烦。而且你会发现如果你不需要使用低效的查询,性能会更好。

于 2012-07-14T15:37:42.420 回答
0

根据您所暴露的,您只需将两个条件放在一起并检查查询是否返回了 1 条记录。如果它没有返回任何记录,他就不是船长:

SELECT *
FROM Teams
WHERE name = 'Zlatan Ibrahimovic' AND position = 'st1';
于 2012-07-14T15:45:40.937 回答