0

したがって、私の知る限り、mysql にはセット、リスト、ディクテーション、または配列はありません。ゲームの試合に関する情報と、試合でプレイされたキャラクターのリストという 2 つのコア コンポーネントを持つシステムを構築したいと考えています。mysql にリストがあれば、次のようにします。

game_id INT,
characters list<varchar>,
....more data

私ができるようにしたい基本的なクエリは次のようなものです:

SELECT * FROM games WHERE characters IN LIST(list);

1 文字だけで選択することも、10 文字を指定することもできます。問題は、mysql でこれを効率的に行う方法と、10WHERE節を使用する方法ORです。キャラクターにも特定の順序はありません...しかし、IDに基づいて順序付けできると思います。

これをうまく行う唯一の方法は、最初のテーブルを基本情報で作成し、2 つ目のテーブルをキャラクター ID と game_id だけで作成することです。

私が知らないかもしれない派手な mysql トリックを使用して、このデータをうまく整理する方法について誰か提案がありますか? 最終的にはクエリが大量になる可能性があるため、クエリも高速である必要があります。ビュー/ダウンロードカウンターを追加しない限り、書き込みよりも読み取りの方がはるかに多くなります....読み取りよりも書き込み/更新の方が多いと思います。

ありがとうございます。喜んで情報を提供します。

4

1 に答える 1

2

あなたの質問を正しく理解していれば、2つの方法が考えられます....

方法 1game_characters ...次のようなテーブルを追加する...

CREATE TABLE `games_characters` (
  `game_id` int(11) DEFAULT NULL,
  `character_id` int(11) DEFAULT NULL,
  KEY `games` (`game_id`),
  KEY `characters` (`character_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

...次に、クエリは次のようになります...

SELECT *
FROM `games` as g
LEFT JOIN `games_characters` as gc
  ON (g.`id` = gc.`game_id`)
WHERE gc.`character_id` IN (12,52,86,23)

方法 2 ... LIKE を使用します。大規模なデータベースにはあまり適していませんが、余分なテーブルを回避します ...レコードには、「.23.51.252.75.93」のようにピリオドで区切られた、characters別のテーブルからの ID の束が含まれます。 characters. クエリは次のようになります

SELECT *
FROM `games`
WHERE `characters` LIKE '%.23.%'
   OR `characters` LIKE '%.58.%'

CMS は文字列を解析して再構築する必要があります。

于 2013-01-23T04:17:06.180 に答える