我知道乍一看标题毫无意义。但情况如下:数据库表名为“团队”。在其中,有一堆足球队的位置(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类型。
答案 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';