SQL / MySQL使用JOIN选择项目

时间:2012-11-09 13:58:51

标签: mysql sql

我有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;

我有一个查询,我想从tb_item选择所有项目,只需每个项目一个图像,我不想使用子查询,我正在使用< strong> JOIN 喜欢这样:

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

但是,当项目有多个图像时,它返回的时间超过1次。 当项目没有图像时,它不会被选中。

所以,我的问题是:是否有可能,通过上面的查询,选择所有项目和1图像o NULL到图像字段。但每个item_id只需一次?

3 个答案:

答案 0 :(得分:0)

没有

公平地说,在没有图像的情况下获取项目可以使用LEFT OUTER JOIN来完成。但是,使用SQL无法获得仅匹配其中一个满足限制的文件的连接。

更新:当然这里不包括MAX()或MIN()等聚合函数,但这些函数不适用于这种情况。并且可以选择子选项,尽管很重: - )

答案 1 :(得分: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中的一列进行排序,然后限制始终具有相同的结果。

答案 2 :(得分:0)

此查询将显示两个表中的所有记录 -

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

如果您想为每个item_id创建一条记录,则需要对结果进行分组。例如 -

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函数返回一个单元格中的子值(以逗号分隔的样式)。


如果只有一个item_img_image item_img_thumb = 1,请尝试此查询 -

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。