我有两张桌子
activity id | user_id | time | activity_id 1 | 1 | | 3 2 | 1 | | 1 and preferences user_id | running | cycling | driving 1 | TRUE | FALSE | FALSE i need result set of id | user_id | time | 2 | 1 | |
我只需要第一个表中的行,其值在首选项表中设置为true。 例如,运行的activity_id是1,它在首选项表中设置为true,因此它返回,而其他则不返回。
答案 0 :(得分:1)
如果你可以编辑架构,那就更好了:
activity
id | name
1 | running
2 | cycling
3 | driving
user_activity
id | user_id | time | activity_id
1 | 1 | | 3
2 | 1 | | 1
preferences
user_id | activity_id
1 | 1
首选项中的行表示架构中的TRUE
值。没有行表示FALSE
。
然后你的查询就是:
SELECT ua.id, ua.user_id, ua.time
FROM user_activity ua
JOIN preferences p ON ua.user_id = p.user_id
AND ua.activity_id = p.activity_id
如果您想在结果中看到活动名称:
SELECT ua.id, ua.user_id, ua.time, activity.name
FROM user_activity ua
JOIN preferences p ON ua.user_id = p.user_id
AND ua.activity_id = p.activity_id
JOIN activity ON ua.activity_id = activity.id
答案 1 :(得分:0)
我可能会做的是将表连接到一个公共列上,看起来user_id
在这种情况下是一个公共列,它允许访问两个表中的列以在where子句中查询查询。
哪种类型的加入取决于您希望从首选项中获取哪些信息
所以你可以查询
SELECT * FROM activity LEFT JOIN preferences ON activity.user_id = preferences.user_id WHERE preferences.columnIWantToBeTrue = true
我正在使用left join
因为你提到你希望第一个表中的值基于第二个表。
答案 2 :(得分:0)
您有一个名为activity
的表,其中id
列看起来像主键。列名activity_id
通常是另一个表中列的名称,该列是activity
表的外键,引用activity.id
。
您似乎已使用activity_id
表格中的activity
列作为“跑步”,“骑车”或“驾驶”的参考。
可以将activity.activity_id = 1
与"running"
匹配,但这是一个奇怪的设计。
以下是一个示例查询:
SELECT a.id
, a.user_id
, a.time
FROM activity a
JOIN preferences p
ON p.user_id = a.user_id
AND ( ( p.running = 'TRUE' AND a.activity_id = 1 )
OR ( p.cycling = 'TRUE' AND a.activity_id = 2 )
OR ( p.driving = 'TRUE' AND a.activity_id = 3 )
)
但是,这又是一个奇怪的设计。
首先,数据库中的每个表都应包含代表实体的行(可以唯一标识的人,地点,事物,概念或事件,非常重要,我们需要存储有关的信息,或实体之间的关系。
根据我们对您的用例的有限信息,实体似乎是“用户”,“活动类型”(跑步,骑自行车,驾驶),“活动”(一段时间,用户和activity_type)和一些用户“首选项”,关于用户喜欢哪个activity_types。
请参阅Mark B的答案,了解可能的架构设计。