MySQL查询将一列的内容与其他列的标题进行比较

时间:2012-07-14 15:32:56

标签: mysql

我知道乍一看标题毫无意义。但情况如下:数据库表名为“团队”。在其中,有一堆足球队的位置(gk1,def1,def2,...,st2)。每列都是VARCHAR类型,包含玩家的名字。还有一个名为“队长”的专栏。该列的内容(不是最幸运的解决方案)不是船长的名字,而是位置。

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

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

如果(Zlatan是队长) 获取行内容

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

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

“团队”表格结构是:

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

所有字段都是VARCHAR类型。

2 个答案:

答案 0 :(得分: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

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

然后你可以很容易地看到第1队的队长是位于第2位的队员11;或者找到队员(如果有的话),其中队员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

......所以你可以让两个守门员(例如)但只是守门员。

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

答案 1 :(得分:0)

通过你暴露的内容,你只需要把两个条件放在一起,检查查询是否返回了1条记录。如果它没有返回记录,他就不是队长:

SELECT *
FROM Teams
WHERE name = 'Zlatan Ibrahimovic' AND position = 'st1';