1

基本的に私が持っているのは画像ギャラリーです。学習目的で作成しようとしました。私が今持っているのは、彼/彼女がカテゴリをクリックすると、ギャラリーを選択する次のmysqlクエリが起動されることです:

    SELECT ID、名前、gallery_thumb FROM ギャラリー WHERE
    category1=$category_id または category2=$category_id または
    category3=$category_id ID DESC で並べ替え

これは、私が一緒に投げた高速でくだらない解決策でした。基本的には、1 つのギャラリーを多くのカテゴリに表示したいと考えています。ここでは、ギャラリーを作成して 3 つ以下のカテゴリに追加できるようにしました。したがって、1 つのギャラリーが異なるカテゴリに表示される場合があります。しかし、この魂は私が望んでいたものではありません。

ギャラリー表:

    CREATE TABLE `ギャラリー` (
`ID` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(1000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `description` varchar(1000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `category1` varchar(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `category2` varchar(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `category3` varchar(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `web_link` varchar(3000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `gallery_thumb` varchar(2000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `reg_time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP, 主キー (`ID`) )

必要な機能が動作するようになれば、category2 と category3 は不要になり、削除されます。

タグ表:

    CREATE TABLE `gallery_tags` (
    `ID` int(11) NOT NULL AUTO_INCREMENT,
    `tag_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    主キー (`ID`)
    )

タグとギャラリーの参照表:

    CREATE TABLE `gallery_tag_reference` (
    `ID` int(11) NOT NULL AUTO_INCREMENT,
    `gallery_id` int(11) NOT NULL,
    `tags_id` int(100) NOT NULL,
    主キー (`ID`)
    )

タグ機能を追加しました。ギャラリーを作成すると、好きなだけタグをギャラリーに追加できます。これで、ギャラリーにはメイン カテゴリが 1 つだけになり、それに関連付けられた多くのタグが表示されます。しかし、ギャラリーを作成したときに追加したタグに基づいて、ギャラリーを他のカテゴリにも表示したいと思います。カテゴリには、事前定義された 1 つ以上のタグがあります。私が今やりたいことは、訪問者がカテゴリをクリックしたときに、以前はクエリのフィルタリング部分だけが異なっていたのと同じデータが選択されるようにすることです。

例:

Category1 には、自動車、青、光沢
のあるタグが含まれます。gallery1 には、青、赤、高速のタグが含まれます。
gallery1 はカテゴリ 1 に属していませんが、テーブル「gallery_tags」にタグ「blue」が追加されているため、訪問者がカテゴリ 1 ボタンをクリックしたときに実行されたクエリの結果に表示されます。

例 2:

Category1 にはタグがありません。
Category2 にはタグがありません。
Category3 にはタグがありません。
Category4 には、定義済みのタグ (黄色、赤) があります。
Category5 には、定義済みのタグ (背の高い、高い) があります。

Gallery1 にはタグはありませんが、Category1 に属します。
Gallery2 にはタグがありませんが、Category2 に属します。
Gallery3 には次のタグがあります: 黄色、背の高い、野原
Gallery3 は Category3 に属します。

訪問者が Category4 ボタンをクリックすると、Category4 に属するギャラリーと、「黄色」または「赤」のタグを持つギャラリーが選択されます。ここには Category4 に属するギャラリーはありませんが、黄色のタグを持つ gallery3 があり、Category4 にも定義済みのタグ "yellow" があるため、ギャラリー 3 をクリックすると、Category4 に表示されます。

カテゴリー5も同様です。直接属するギャラリーはありませんが、gallery3 には "tall" というタグが関連付けられており、Category5 にも定義済みのタグ "tall" があるため、gallery3 は Category5 にも表示されます。

私が達成したいことを明確に説明したことを願っています。私は MySQL の経験があまりないので、必要なクエリをまとめるのに苦労しています。誰かが助けてくれることを願っています!

4

1 に答える 1

2

では、選択の基本単位はタグカテゴリです。それらのテーブルを作成することから始めましょう。

CREATE TABLE tags (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  -- Maybe some other things you want? Tag description?
  UNIQUE INDEX name
);

これによりtagsテーブルが得られ、それを埋めることができます

INSERT INTO tags(name) VALUES
  ('car'),('blue'),('shiny'),('red'),('fast'),('yellow'),('tall'),('high'),('field')
;

基本的に、カテゴリでも同じことが起こります。

CREATE TABLE categories (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  -- Maybe some other things you want? Description?
  UNIQUE INDEX name
);

INSERT INTO categories(name) VALUES
  ('cars'),('people'),('colors'),('landscapes'),('misc')
;

そして今、ギャラリーを見ることができます:

  • すべてのギャラリーは正確に 1 つのカテゴリに属する​​必要があり (現在)、すべてのカテゴリに多くのギャラリーを含めることができます。これはカテゴリの POV からの関係であるため、関係の- 側であるギャラリーに1:nポインター フィールドが必要です。ここでは簡潔nにするために外部キーを使用しません。外部キーの使用を検討することを強くお勧めします。
  • すべてのギャラリーは多くのタグを持つことができ、すべてのタグは多くのギャラリーに属することができます。つまり、これは n:m 関係であり、テーブルに直接フィールドは必要ありませんが、結合テーブルが必要です。
  • すべてのカテゴリは多くのタグを持つことができ、すべてのタグは多くのカテゴリに属する​​ことができます - つまり同じことです

そこで、次のようにします。

CREATE TABLE galleries (
  id int(11) PRIMARY KEY AUTO_INCREMENT,
  name varchar(100)  NOT NULL,
  category` INT NOT NULL,
  -- the other fields you want: description, web_link, gallery_thumb,reg_time
  UNIQUE INDEX(name)
)

カテゴリのデータ型INTに注意してください。これは、カテゴリ テーブルの主キーにもリンクされますINT

そして、結合テーブルを忘れないでください:

CREATE TABLE galleries_tags (
  gallery INT,
  tag INT,
  PRIMARY KEY(tag, gallery),
  KEY(gallery)
);

CREATE TABLE categories_tags (
  category INT,
  tag INT,
  PRIMARY KEY(tag, category),
  KEY(category)
);

tagタイプのフィールドは、INTこれらの結合テーブルをテーブルのidフィールドにリンクしtagsますが、galleryresp. fields は、それぞれのテーブルcategoryのフィールドにリンクします。id

ここでもテーブルにINSERTクエリを入力します。(それらを書くのが面倒です)

これでデータベースにデータが保存されたので、もう一度データを取得します。

ユースケース: ユーザーがカテゴリをクリックし、ギャラリーを選択したい。

  • このカテゴリーで提出された
  • またはこのカテゴリのタグを共有する

これは非常に簡単ですが、少し考える必要があります。

  • あなたのターゲットテーブルはcategories
  • カテゴリによる選択には、直接セレクタがあります:categoryフィールド
  • タグで選択するには、上記の結合テーブルを介して結合する必要があります
  • 組み合わせた選択の場合LEFT JOIN、カテゴリのみの選択を見逃したくない場合は、する必要がありますが、これによりパフォーマンスが低下します。だからあなたは別々を選択しUNION、結果

ユーザーがカテゴリ 4 を選択したと仮定します。

SELECT * FROM galleries WHERE category=4
UNION
SELECT categories.* 
FROM galleries
INNER JOIN galleries_tags ON galleries.id=galleries_tags.gallery
INNER JOIN categories_tags ON categories_tags.tag=galleries_tags.tag
WHERE categories_tags.category=4

ボブはあなたのおじです。

このクエリは何をしますか? 最初の部分は単純で、2 番目の部分はそれらのギャラリーを選択します。

  • タグが付いています ( INNER JOIN galleries_tags ON ...)
  • カテゴリが添付されているタグ ( INNER JOIN categories_tags ON ...)
  • どのカテゴリにid4がありますか
于 2012-07-09T10:58:53.527 に答える