标签: relational-division

如何以多次通过关系过滤SQL结果

假设我有表student,club以及student_club:

student {
    id
    name
}
club {
    id
    name
}
student_club {
    student_id
    club_id
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何找到足球(30)和棒球(50)俱乐部的所有学生.
虽然这个查询不起作用,但它是我迄今为止最接近的事情:

SELECT student.*
FROM   student
INNER  JOIN student_club sc ON student.id = sc.student_id
LEFT   JOIN club c ON c.id = sc.club_id
WHERE  c.id = 30 AND c.id = 50
Run Code Online (Sandbox Code Playgroud)

mysql sql postgresql relational-division sql-match-all

95
推荐指数
4
解决办法
2万
查看次数

选择与列表中的所有项匹配的行

假设我有两个表:

cars - 汽车清单

carname | modelnumber | ...
Run Code Online (Sandbox Code Playgroud)

passedtest - 包含汽车通过的每项测试:

id | carname | testtype | date | ...
1  | carA    | A        | 2000 |
2  | carB    | C        | 2000 |
3  | carC    | D        | 2001 |
4  | carA    | C        | 2002 |
Run Code Online (Sandbox Code Playgroud)

现在,我如何从passedtest通过所有测试(A,B,C,D)的表格中选择一辆汽车?

我尝试了这个IN声明,但它也匹配通过一次测试的汽车.我正在寻找一个语句来匹配所有行中列表中的所有值.

sql t-sql sql-server relational-division

34
推荐指数
3
解决办法
6万
查看次数

选择满足不同行的不同条件的值?

这是一个我无法弄清楚的非常基本的查询....

假设我有一个像这样的两列表:

userid  |  roleid
--------|--------
   1    |    1
   1    |    2
   1    |    3
   2    |    1
Run Code Online (Sandbox Code Playgroud)

我想得到所有具有roleids1,2和3的不同用户ID .使用上面的例子,我想要返回的唯一结果是userid1.我该怎么做?

mysql sql relational-division sql-match-all

29
推荐指数
3
解决办法
1万
查看次数

所有在数组中的PostgreSQL

实现子句中最简单,最快速的方法是什么,必须匹配数组中的所有元素 - 使用时不仅仅是一个IN?毕竟它应该像mongodb的$ all.

考虑到conversation_users是conversation_id和user_id之间的连接表的群组对话,我有类似这样的想法:

WHERE (conversations_users.user_id ALL IN (1,2))
Run Code Online (Sandbox Code Playgroud)

更新 16.07.12

添加有关架构和案例的更多信息:

  1. join-table非常简单:

                  Table "public.conversations_users"
         Column      |  Type   | Modifiers | Storage | Description 
    -----------------+---------+-----------+---------+-------------
     conversation_id | integer |           | plain   | 
     user_id         | integer |           | plain   | 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对话有很多用户,用户属于许多对话.为了找到对话中的所有用户,我正在使用此连接表.

  3. 最后,我试图在轨道scope上找出一个红宝石,根据它的参与者找到我的对话 - 例如:

    scope :between, ->(*users) {
      joins(:users).where('conversations_users.user_id all in (?)', users.map(&:id))
    }
    
    Run Code Online (Sandbox Code Playgroud)

更新 23.07.12

我的问题是找到一个完全匹配的人.因此:

(1,2,3)如果查询,则之间的对话将不匹配(1,2)

sql postgresql activerecord ruby-on-rails relational-division

25
推荐指数
3
解决办法
2万
查看次数

SQL查询"IN"充当"AND"而不是"OR"?

原谅标题,我不知道该怎么称呼这个.所以想象我有这个

table_ref

id_x|id_y
---------
6|70
6|71
6|72
6|73
8|70
8|73
9|72
9|73
Run Code Online (Sandbox Code Playgroud)

我怎样才能选择id_y它是否匹配id_x= 6 & 8 & 9?在这种情况下,它应该归还我73

返回的结果id_y将用作另一个SQL查询中的内连接.

sql t-sql sql-server sql-server-2008 relational-division

25
推荐指数
2
解决办法
1909
查看次数

如何在PostgreSQL中有效地设置减去连接表?

我有以下表格:

  • work_units - 自我解释
  • workers - 自我解释
  • skills - 如果您想要工作,每个工作单位都需要一些技能.每个工人都精通各种技能.
  • work_units_skills - 加入表
  • workers_skills - 加入表

工作人员可以请求下一个适当的免费最高优先级(无论这意味着)分配给她的工作单元.


目前我有:

SELECT work_units.*
FROM work_units
-- some joins
WHERE NOT EXISTS (
        SELECT skill_id
        FROM work_units_skills
        WHERE work_unit_id = work_units.id

        EXCEPT

        SELECT skill_id
        FROM workers_skills
        WHERE worker_id = 1 -- the worker id that made the request
      )
-- AND a bunch of other conditions
-- ORDER BY something complex
LIMIT 1
FOR UPDATE SKIP LOCKED;
Run Code Online (Sandbox Code Playgroud)

这种情况使查询慢了8-10倍.

是否有更好的方式来表达work_units技能应该是技能的一部分workers或改善当前查询的东西?


更多背景: …

sql postgresql performance set-operations relational-division

19
推荐指数
3
解决办法
864
查看次数

SQL查询通过中间表

给出以下表格:

Recipes
| id | name
| 1  | 'chocolate cream pie'
| 2  | 'banana cream pie'
| 3  | 'chocolate banana surprise'

Ingredients
| id | name
| 1  | 'banana'
| 2  | 'cream'
| 3  | 'chocolate'

RecipeIngredients
| recipe_id | ingredient_id
|     1     |      2
|     1     |      3
|     2     |      1
|     2     |      2
|     3     |      1
|     3     |      3
Run Code Online (Sandbox Code Playgroud)

如何构建SQL查询以查找recipe.name ='chocolate'和ingredients.name ='cream'的配方?

sql join where relational-division

18
推荐指数
2
解决办法
3万
查看次数

如何找到所有比萨饼供30岁以上的人吃掉的披萨?

我正在关注斯坦福数据库课程,并且有一个问题,我们找到了所有的比萨饼,只使用关系代数为超过30岁的人们吃的每个比萨饼提供服务.

问题包括一个有四个关系的小型数据库:

Person(name, age, gender)       // name is a key
Frequents(name, pizzeria)       // [name,pizzeria] is a key
Eats(name, pizza)               // [name,pizza] is a key
Serves(pizzeria, pizza, price)  // [pizzeria,pizza] is a key
Run Code Online (Sandbox Code Playgroud)

我知道如何找到30多个披萨的人吃了它们并制作了它们的交叉产品,所以我可以检查哪个披萨店都有.

我可以列出所有比萨店供应那些披萨,但我不知道如何删除任何只有一个组合的比萨店(如多米诺).

Chicago Pizza   cheese  cheese
Chicago Pizza   cheese  supreme
Chicago Pizza   supreme cheese
Chicago Pizza   supreme supreme
Dominos         cheese  cheese
Dominos         cheese  supreme
Run Code Online (Sandbox Code Playgroud)

问答论坛告诉我们使用分部并指出我们的几个演示文稿.虽然我得到了动作的结果,但我并不真正理解如何将公式转换为关系代数语法.

任何人都可以向我解释我错过了什么,希望没有完全给出解决方案吗?

relational-algebra relational-division

16
推荐指数
3
解决办法
1万
查看次数

MySQL选择连接在何处AND

我的数据库中有两个表:

制品

  • id(int,主键)
  • 名称(varchar)

ProductTags

  • product_id(int)
  • tag_id(int)

我想选择具有所有给定标签的产品.我试过了:

SELECT
    *
FROM
    Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE
    ProductTags.tag_id IN (1, 2, 3)
GROUP BY
    Products.id
Run Code Online (Sandbox Code Playgroud)

但它给了我带有任何给定标签的产品,而不是所有给定的标签.写作WHERE tag_id = 1 AND tag_id = 2毫无意义,因为不会返回任何行.

mysql join where-in relational-division

13
推荐指数
1
解决办法
6万
查看次数

在WHERE子句中多次使用相同的列

我有一个下表结构.

USERS

USERS数据

PROPERTY_VALUE

PROPERTY_VALUE数据

PROPERTY_NAME

PROPERTY_NAME数据

USER_PROPERTY_MAP

USER_PROPERTY_MAP数据

我正在尝试从users表中检索具有匹配属性的用户property_value.

单个用户可以拥有多个属性.这里的示例数据有2个用户'1'的属性,但是可以有2个以上.我想在WHERE子句中使用所有这些用户属性.

如果用户具有单个属性但是对于多于1个属性失败,则此查询有效:

SELECT * FROM users u
INNER JOIN user_property_map upm ON u.id = upm.user_id
INNER JOIN property_value pv ON upm.property_value_id = pv.id
INNER JOIN property_name pn ON pv.property_name_id = pn.id
WHERE (pn.id = 1 AND pv.id IN (SELECT id FROM property_value WHERE value like '101')
AND pn.id = 2 AND pv.id IN (SELECT id FROM property_value WHERE value like '102')) and u.user_name = 'user1' and u.city = …
Run Code Online (Sandbox Code Playgroud)

sql postgresql relational-division

11
推荐指数
4
解决办法
1276
查看次数