MySql关系分区内部连接语法超过3个表

时间:2014-05-02 08:46:57

标签: mysql sql inner-join relational-division

我遇到的问题类似于以下问题: 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)

如何正确扩展这一点以添加实际上我所知道的是类别表标题值。

感谢您的帮助。

利兹

4 个答案:

答案 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 ;

Fiddle Demo

第二种情况相同' 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),其中名称在('行走','较旧')