-1

多対多のデー​​タベースにクエリを実行する方法を学びたいと思います。これは、3 つのテーブルと 3 つの外部キーを持つ 1 つの多対多テーブルを持つデータベースの例です。テーブルに対して SELECT ステートメントをどのように実行しますか?st_glowne_others

たとえば、「st_glowne」テーブルの名前列の特定の値と「st_pages」テーブルの名前列の特定の値にリンクする「st_components」テーブルから可能なすべての結果を SELECT したい場合。前もって感謝します!。

3 つの外部キーによる多対多

表1

CREATE TABLE `st_glowne` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) COLLATE utf8_polish_ci NOT NULL,
 `location` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT './',
 PRIMARY KEY (`name`),
 KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci

表2

CREATE TABLE `st_pages` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) COLLATE utf8_polish_ci NOT NULL,
 `filelocation` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT 'pages/',
 PRIMARY KEY (`name`),
 KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_c

表3

CREATE TABLE `st_components` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) COLLATE utf8_polish_ci NOT NULL,
 `location` varchar(100) COLLATE utf8_polish_ci NOT NULL DEFAULT 'components/',
 PRIMARY KEY (`name`),
 KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci

これは、クエリを実行するテーブルです。

CREATE TABLE `st_glowne_others` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `st_glowne` varchar(50) COLLATE utf8_polish_ci NOT NULL,
 `st_pages` varchar(50) COLLATE utf8_polish_ci NOT NULL,
 `st_components` varchar(50) COLLATE utf8_polish_ci NOT NULL,
 PRIMARY KEY (`id`),
 KEY `id` (`id`),
 KEY `st_glowne` (`st_glowne`),
 KEY `st_pages` (`st_pages`),
 KEY `st_components` (`st_components`),
 KEY `st_components_2` (`st_components`),
 CONSTRAINT `st_glowne_others_ibfk_3` FOREIGN KEY (`st_components`) REFERENCES `st_components` (`name`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `st_glowne_others_ibfk_1` FOREIGN KEY (`st_glowne`) REFERENCES `st_glowne` (`name`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `st_glowne_others_ibfk_2` FOREIGN KEY (`st_pages`) REFERENCES `st_pages` (`name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci

そこからクエリを実行する方法を教えてください。大変感謝します !

4

1 に答える 1

2

最も簡単な方法は、結合を使用することです。

SELECT * FROM `st_glowne_others` go
LEFT JOIN `st_glowne` ON `st_glowne`.name = go.st_glowne
LEFT JOIN `st_pages` ON `st_pages`.name = go.st_pages
LEFT JOIN `st_components` ON `st_components`.name = go.st_components

ただし、スキーマを再考することをお勧めします。PK を名前フィールドにする理由はありますか? AUTO INCREMENT2 つのテーブルを結合するためのより標準的な方法で あるid 列があります。

例(各テーブルについて):

CREATE TABLE `st_glowne` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) COLLATE utf8_polish_ci NOT NULL,
 `location` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT './',
 PRIMARY KEY (`id`),
)

次に、st_glowne_othersテーブルで ID 列を参照します。

CREATE TABLE `st_glowne_others` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `st_glowne_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `st_glowne_id` (`st_glowne_id`),
 CONSTRAINT `st_glowne_others_ibfk_3` FOREIGN KEY (`st_glowne_id`) REFERENCES `st_glowne` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
) 
于 2013-09-22T00:54:24.577 に答える