假设我有表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) 假设我有两个表:
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
声明,但它也匹配通过一次测试的汽车.我正在寻找一个语句来匹配所有行中列表中的所有值.
这是一个我无法弄清楚的非常基本的查询....
假设我有一个像这样的两列表:
userid | roleid
--------|--------
1 | 1
1 | 2
1 | 3
2 | 1
Run Code Online (Sandbox Code Playgroud)
我想得到所有具有roleids
1,2和3的不同用户ID .使用上面的例子,我想要返回的唯一结果是userid
1.我该怎么做?
实现子句中最简单,最快速的方法是什么,必须匹配数组中的所有元素 - 使用时不仅仅是一个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
添加有关架构和案例的更多信息:
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)对话有很多用户,用户属于许多对话.为了找到对话中的所有用户,我正在使用此连接表.
最后,我试图在轨道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
原谅标题,我不知道该怎么称呼这个.所以想象我有这个
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查询中的内连接.
我有以下表格:
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
给出以下表格:
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'的配方?
我正在关注斯坦福数据库课程,并且有一个问题,我们找到了所有的比萨饼,只使用关系代数为超过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)
问答论坛告诉我们使用分部并指出我们的几个演示文稿.虽然我得到了动作的结果,但我并不真正理解如何将公式转换为关系代数语法.
任何人都可以向我解释我错过了什么,希望没有完全给出解决方案吗?
我的数据库中有两个表:
制品
ProductTags
我想选择具有所有给定标签的产品.我试过了:
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
毫无意义,因为不会返回任何行.
我有一个下表结构.
USERS
PROPERTY_VALUE
PROPERTY_NAME
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 ×8
postgresql ×4
mysql ×3
join ×2
sql-server ×2
t-sql ×2
activerecord ×1
performance ×1
where ×1
where-in ×1