select语句只包含在第二个表中设置为true的行

时间:2014-03-31 15:30:50

标签: mysql sql

我有两张桌子

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,因此它返回,而其他则不返回。

3 个答案:

答案 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子句中查询查询。

哪种类型的加入取决于您希望从首选项中获取哪些信息

Handy Visual Guide for joins

所以你可以查询

SELECT * FROM activity LEFT JOIN preferences ON activity.user_id = preferences.user_id WHERE preferences.columnIWantToBeTrue = true

我正在使用left join因为你提到你希望第一个表中的值基于第二个表。

答案 2 :(得分:0)

迈克B有正确的答案。关系模型通过常用值将行相关联。

您有一个名为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的答案,了解可能的架构设计。