0

私はインタラクティブなフェスティバル プログラムを作成しており、簡単に表示および検索できるように情報をデータベースに保存することにしました。各ショーは 3 つの異なる言語で表示でき、1 つまたは複数のショー時間とさまざまなアーティストを設定できます。そのため、ショーごとに異なる可能性のある多くのことがあり、そのため、いくつかの情報を独自の表に含めることが最善です. 同じアーティストが多くの異なるショーに出演する可能性があり、各ショーのアーティスト数が異なるため、特にアーティスト。

これまでのところ、ショーのタイトル、説明、ショー時間、チケット価格などを含むメイン テーブルが 1 つあります。アーティストに独自のテーブルを持たせ、ID でアーティストを参照し、PHP スクリプトとしてさまざまなショーにアタッチします。メインテーブルをループします。

  1. メイン テーブルの別のテーブルからアーティスト ID を参照するにはどうすればよいですか?

  2. テーブルからアーティストを取得する適切なクエリはどのようなものでしょうか?

テーブル (暫定計画):

メインテーブル

id | show title | show date | description | performers
------------------------------------------------------
1  | Beethoven  | 13.4.2013 | A classic   | 1,35,22,3
2  | Mozart     | 14.4.2013 | Fantastic   | 9,4,66

etc..

アーティストテーブル

id | name  | instrument |
-------------------------
1  | Steve | Violin     |
2  | Alex  | Piano      |

etc...

「出演者」列の数字は、アーティスト テーブルの ID に対応します。ただし、これがそれらを参照する正しい方法であるかどうかはわかりません。次に、PHP スクリプトは両方を組み合わせて、完全なショー アイテムを出力します。

どんな助けでも大歓迎です。

4

3 に答える 3

0

質問しているクエリを実行する方法は、通常「結合」テーブルと呼ばれるものを使用することです。これは、1 つの列に番組 ID を、別の列にアーティスト ID をリストする追加のテーブルです。例えば:

MainArtists テーブル

showid | artistid
-------------------
1      | 1
1      | 2
2      | 1

この結合テーブルでは、Steve と Alex の両方が Beethoven ショーに参加していますが、Steve だけが Mozart ショーに参加しています。

それらを取得するには、mysql で join コマンドを使用します。

SELECT * FROM Main
INNER JOIN MainArtists ON ShowArtists.showid = Main.id
INNER JOIN Artists ON Artists.id = MainArtists.artistid

このクエリは、番組ごとにアーティストごとに 1 つの行を取得します。ショー #1 のアーティストのリストのみが必要な場合は、最後に「WHERE main.id = 1」を追加します。

Main および Artists の id 列を主キーとして割り当て、MainArtists の showid および artistid 列をそれぞれのテーブルにリンクする外部キーとして割り当てることをお勧めします。結合および外部キーと主キーの関係に関するリソースはインターネット上に多数あるため、これらの用語を検索すると役立つはずです。

于 2013-04-03T21:01:16.840 に答える
0

データスキーマを設定する方法は次のとおりです。

CREATE TABLE `artists` (
  `artist_id` int(10) unsigned NOT NULL auto_increment,
  `artist_name` varchar(100) NOT NULL default '',
  `instrument` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`artist_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `Shows` (
  `show_id` int(11) NOT NULL auto_increment,
  `show_title` varchar(255) NOT NULL default '',
  `description` varchar(255) NOT NULL default '',
  `language` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`show_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `show_times` (
  `show_time_id` int(10) unsigned NOT NULL auto_increment,
  `show_id` int(10) unsigned NOT NULL default '0',
  `show_date` date NOT NULL default '0000-00-00',
  `show_time` time NOT NULL default '00:00:00',
  PRIMARY KEY  (`show_time_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `show_time_artist_lookup` (
  `show_time_id` int(10) unsigned NOT NULL default '0',
  `artist_id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`show_time_id`,`artist_id`)
) TYPE=MyISAM;

これにより、同じショー情報を異なる日時に使用できます。次に、ルックアップ テーブルを使用してアーティストを上映時間に関連付けます。

編集:実際には、言語の場合、オプションのセットが少ないため、バイナリ演算を使用して小さな数値を単一のフィールドに格納できます。例えば:

1 = 英語 2 = イタリア語 4 = ドイツ語

TinyINT 値を格納できます (スキーマをこれに変更します)

`language` tinyint(2) NOT NULL default '1',

3 つの値のいずれか、または組み合わせで。たとえば、番組が英語とイタリア語で提供されている場合、値 3 を格納します。3 つの言語すべての場合、値は 7 になります。次に、番組データを取得するときに、任意のプログラミング言語を使用してバイナリ数学比較を行い、それをデコードします。 . これは PHP でそれを行う方法を説明するページです: http://www.litfuel.net/tutorials/bitwise.htm

于 2013-04-03T20:58:55.280 に答える
0

showshow_id、name の 2 つの列を持つテーブルがあるとします。show_id は PRIMARY KEY です。artistartist_id と name の 2 つの列を持つテーブルがあるとします。ここで、artist_id は PRIMARY KEY です。

必要なものは m:n 関係と呼ばれ、1 人のアーティストが多くのショーに割り当てられ、1 つのショーが多くのアーティストを持つことができることを意味します。そのためには、この関係を保存する新しいテーブルを作成する必要があります。show_artistshow_id、artist_id という 2 つの列で名前を付けましょう。両方の列が PRIMARY KEY になります。このテーブルの各行には、特定のアーティスト (artist_id で定義) と 1 つのショー (show_id で定義) の間の 1 つの関係が格納されます。

show_id がわかっている場合は、次のクエリを使用して、このショーのすべてのアーティスト名を取得できます。

SELECT name FROM show_artist JOIN artist USING (artist_id) WHERE show_id = [YOUR SHOW ID]
于 2013-04-03T21:00:12.823 に答える