-3

タイトルが一見意味をなさないことはわかっています。しかし、状況は次のとおりです。DB テーブルの名前は「teams」です。その中には、サッカー チームのポジション (gk1、def1、def2、...、st2) の列がたくさんあります。各列は VARCHAR 型で、プレーヤーの名前が含まれています。「キャプテン」という名前の列もあります。そのコラムの内容は(最も幸運な解決策ではありませんが)キャプテンの名前ではなく、むしろポジションです。

したがって、「st1」のコンテンツがズラタン イブラヒモビッチで、彼がキャプテンである場合、「キャプテン」のコンテンツは文字列「st1」であり、文字列「ズラタン イブラヒモビッチ」ではありません。

ここで、'teams' テーブルから行を取得するクエリを作成する必要がありますが、キャプテンがズラタン イブラヒモビッチの場合のみです。この時点で、彼が st1、st2、またはその他のポジションをプレイしているかどうかはわかりません。そのため、クエリで名前だけを使用して、彼がプレーするポジションがキャプテンとして設定されているかどうかを確認する必要があります。論理的には、次のようになります。

if(ズラタンがキャプテン) 行の内容を取得

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

...ここで参照されているチーム、プレーヤー、およびポジションを識別することができる他のテーブルを使用します。各チームにキャプテンが 1 人しかいないこと、ゴールキーパーが 1 人しかいないことなどを確認するために、いくつかの参照チェックが必要になります。

チーム 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

...ゴールキーパーである 2 人のプレーヤー (たとえば) を持つことができますが、それらはフィールドのみです。

データベースの再設計は大変な作業になる場合があります。しかし、既存のデザインを使用するほど複雑でも面倒でもありません。また、非効率的なクエリを使用する必要がなければ、パフォーマンスが向上することがわかります。

于 2012-07-14T15:37:42.420 に答える
0

公開したものによって、2 つの条件を設定し、クエリが 1 つのレコードを返したかどうかを確認するだけです。レコードが返されない場合、彼はキャプテンではありません。

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