0

私はこのような2つのテーブルを持っています:

CREATE  TABLE IF NOT EXISTS tb_item (
  item_id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  item_name VARCHAR(100) NULL ,
  PRIMARY KEY (item_id)
ENGINE = InnoDB;


CREATE  TABLE IF NOT EXISTS tb_item_img (
  item_img_id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  item_img_thumb ENUM('0','1') NULL DEFAULT '0' ,
  item_img_image VARCHAR(100) NULL ,
  item_id INT UNSIGNED NOT NULL ,
  PRIMARY KEY (item_img_id) ,
  INDEX fk_tb_item_img_tb_item1_idx (item_id ASC) ,
  CONSTRAINT fk_tb_item_img_tb_item1
    FOREIGN KEY (item_id )
    REFERENCES tb_item (item_id )
    ON DELETE RESTRICT
    ON UPDATE RESTRICT)
ENGINE = InnoDB;

そして、すべてのアイテムを選択したいクエリが1つtb_itemあり、各アイテムに1つの画像だけを選択します。サブクエリを使用したくないので、次のようにJOINを使用しています:

SELECT `item_id`, `item_name`, `item_img_image`
FROM (`tb_item`)
INNER JOIN `tb_item_img` USING ( `item_id` ) 
LIMIT 8

ただし、アイテムに複数の画像がある場合、複数回返されます。アイテムに画像がない場合、選択されていません。

したがって、私の質問は次のとおりです。上記のようなクエリを使用して、すべてのアイテムと 1 つの画像または NULL を画像フィールドに選択することは可能ですか。しかし、それぞれ一度だけitem_idですか?

4

3 に答える 3

0

いいえ。

公平を期すために、画像がない場合のアイテムの取得は、 を使用して行うことができますLEFT OUTER JOIN。しかし、SQL を使用して、制限を満たすファイルの 1 つだけに一致する結合を取得する方法はありません。

更新: もちろん、ここには MAX() や MIN() などの集計関数は含まれていませんが、これらはこのケースには当てはまりません。そして、重いですが、副選択で可能です:-)

于 2012-11-09T14:02:07.007 に答える
0

内部結合ではできません。

小さな制限を使用しているため、これを使用する必要があります

SELECT 
  `item_id`, 
  `item_name`,  
  (select `item_img_image` from `tb_item_img` where `item_id` = `tb_item`.`item_id`) as `item_img_image`
FROM (`tb_item`) 
LIMIT 8

また、tb_item のいずれかの列でソートしてから、常に同じ結果になるように制限してみてください。

于 2012-11-09T14:05:42.877 に答える
0

このクエリは、2 つのテーブルのすべてのレコードを表示します -

SELECT * FROM tb_item t1
  LEFT JOIN tb_item_img t2
    ON t1.item_id = t2.item_id

ごとitem_idに 1 つのレコードが必要な場合は、結果をグループ化する必要があります。例えば ​​-

SELECT
  t1.*, GROUP_CONCAT(t2.item_img_id)
FROM tb_item t1
  LEFT JOIN tb_item_img t2
    ON t1.item_id = t2.item_id
GROUP BY
  t1.item_id

GROUP_CONCAT関数は、子の値を 1 つのセル (カンマ区切りスタイル) で返します。


item_img_image= 1が1 つしかない場合はitem_img_thumb、次のクエリを試してください -

SELECT
  t1.*, t2.item_img_image -- GROUP_CONCAT(t2.item_img_image)
FROM tb_item t1
  LEFT JOIN tb_item_img t2
    ON t1.item_id = t2.item_id
WHERE
  t2.item_img_thumb = 1
GROUP BY
  t1.item_id

...複数ある場合は、集計関数を適用します (例: GROUP_CONCAT)。

于 2012-11-09T14:59:56.470 に答える