我遇到的问题类似于以下问题: SQL: Get Products from a category but also must be in another set of categories
但我需要包含3个表格(仅涉及2个表格)
我有三个表:Image,Category和CategoryImage。
图像: id名称
1 Fred
2 Joan
CategoryImage imageId categoryId
1 10
1 20
1 30
2 15
2 20
2 30
3 10
类别 id title
10 Hiking
15 Walking
20 Family
30 Older
传递给查询的唯一值是类别标题。由于数据是通过现有的网站应用程序发布的,我对这种情况感到困惑。
我想返回我感兴趣的所有类别中的图像的图像ID - 即,如果用户选择'远足','家庭'和'较旧',那么我想只看到图像1。如果用户选择“行走”和“较旧”,我只会看到图像2。
如果我手动插入类别ID,链接问题中的sql会起作用。
select t0.id, t0.name
from image t0
inner join CategoryImage t1
on (t0.Id = t1.imageId AND t1.categoryId = 10)
inner join CategoryImage t2
on (t0.Id = t2.imageId AND t2.categoryID = 20)
inner join CategoryImage t3
on (t0.Id = t3.imageId AND t3.categoryID = 30)
如何正确扩展这一点以添加实际上我所知道的是类别表标题值。
感谢您的帮助。
利兹
答案 0 :(得分:0)
简单地
select t0.*
from
image t0
join CategoryImage t1 on t0.id = t1.imageId
join Category t2 on t1. categoryId = t2.id
where
t2.id in ( $list_of_id )
哪个
$list_of_id = implode(",", $ids);
或
$list_of_id = '10,20,30';
答案 1 :(得分:0)
image是一种数据类型。 plz,更改表名称图像并尝试此查询......
从table1.id = table2.id上的table1内连接table2中选择* table2.id = table3.id中的内连接table3其中(条件)
答案 2 :(得分:0)
如果您在查询中使用了类别名称的计数,例如'徒步旅行'家庭','老年人&# 39; 计数为3,因此您可以使用以下查询,SUM
IN()
表达式将为您提供每个图像组的计数,并且在HAVING
子句中您可以过滤你的病情结果
SELECT t0.id, t0.name ,
SUM(t2.title IN('Hiking', 'Family','Older')) `image_exist`
FROM image t0
INNER JOIN CategoryImage t1
ON (t0.Id = t1.imageId)
INNER JOIN Category t2
ON (t2.id = t1.categoryId)
GROUP BY t0.id
HAVING image_exist >= 3 ;
第二种情况相同' Walking'和'较旧' 计数是2,你可以这样做
SELECT t0.id, t0.name ,
SUM(t2.title IN('Walking','Older')) `image_exist`
FROM image t0
INNER JOIN CategoryImage t1
ON (t0.Id = t1.imageId)
INNER JOIN Category t2
ON (t2.id = t1.categoryId)
GROUP BY t0.id
HAVING image_exist >= 2 ;
答案 3 :(得分:0)
解决方案
从图像t0内连接categoryImage t1中选择t0。* 在t0.id = t1.ImageID 其中的t1.CategoryID(从类别中选择ID,其中包括姓名)('徒步旅行','家庭','老年人')) 按t0.id,t0.name分组 有计数(categoryid)=(从类别中选择计数(id),其中名称在('徒步旅行','家庭','老年人')
从图像t0内连接categoryImage t1中选择t0。* 在t0.id = t1.ImageID 其中的t1.CategoryID(从类别中选择ID,其中名称为(' Walking','较旧')) 按t0.id,t0.name分组 有计数(categoryid)=(从类别中选择计数(id),其中名称在('行走','较旧')