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;

我有一个查询,我想从中选择所有项目,tb_item每个项目只有一个图像,我不想使用子查询,我正在使用这样的JOIN

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

但是,当商品有超过 1 张图片时,它会返回超过 1 次。当项目没有图像时,它不会被选中。

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

4

3 回答 3

0

不。

公平地说,可以使用LEFT OUTER JOIN. 但是没有办法使用 SQL 来获得只匹配满足限制的文件之一的连接。

更新:当然这里不包括像 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

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

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_thumb1,那么试试这个查询 -

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 回答