我有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
只需一次?
答案 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。