假设我有一个匹配person_ids 到pets的表。我有一份房主必须拥有的理想宠物清单(至少每只宠物之一),从下表中,我想看看谁符合要求。
该列表当然是(dog, cat, tiger). 人们绝对可以拥有不止一种,但这些都是必不可少的(因此person_id = 1是唯一有效的)。
+---------+-----------+--------+
| home_id | person_id | pet |
+---------+-----------+--------+
| 1 | 1 | dog |
| 2 | 1 | dog |
| 3 | 1 | cat |
| 4 | 1 | tiger |
| 5 | 2 | dog |
| 6 | 2 | cat |
| 7 | 3 | <null> |
| 8 | 4 | tiger …Run Code Online (Sandbox Code Playgroud) 我有一个产品 ID 列表,我想找出哪些订单包含所有这些产品。订单表的结构如下:
order_id | product_id
----------------------
1 | 222
1 | 555
2 | 333
Run Code Online (Sandbox Code Playgroud)
显然我可以通过 PHP 中的一些循环来做到这一点,但我想知道是否有一种优雅的方法可以纯粹在 mysql 中做到这一点。我理想的幻想查询是这样的:
SELECT order_id
FROM orders
WHERE (222,555) IN GROUP_CONCAT(product_id)
GROUP BY order_id
Run Code Online (Sandbox Code Playgroud)
我还有希望吗?或者我应该去读托尔金吗?:) 另外,出于好奇,如果在 mysql 中不可能,是否还有其他数据库具有此功能?
这是我从一本书中得到的一个问题(不记得哪一本),它是这样的:
你有三个表:
supId, name)prodId, name)supId, prodId)您需要通过一个查询找到供应商X所拥有的所有产品(或更多)的所有供应商(假设供应商X是其中的那个supId=1).
(如果供应商1在他的库存中有香蕉和苹果,你需要找到所有至少带有香蕉和苹果的供应商)
您只能使用标准SQL(包括连接).
显然这是一个已知的问题/问题,你应该看看这个问题: 如何过滤多次通过关系的SQL结果 (优秀的解决方案和分析)
我试图改变一些东西让它对我有用.我认为我的问题对于了解SQL的人来说非常容易.我有下表(两列):
entry_id | cat_id
5 | 3
6 | 3
7 | 3
7 | 5
7 | 6
8 | 5
9 | 3
9 | 5
Run Code Online (Sandbox Code Playgroud)
现在我想要计算cat_id 3和5中的所有entry_id(它们必须在两个类别中).我怎么做才能得到"2"(条目7和9的总和为2).
希望有人能提供帮助.谢谢!
关系部门是Codd的原始关系运营商之一,俗称供应所有部件的供应商.已经有各种SQL翻译,例如Celko使用可以飞行机库中所有飞机的飞行员的例子讨论了几种方法.
我更喜欢的是"与集合运算符的划分",因为它是"有余数"(即威尔逊也可以飞行F-17战斗机,但机库中没有一个)以及它如何处理这个除数是空集(即当机库为空时,返回所有飞行员):
WITH PilotSkills
AS
(
SELECT *
FROM (
VALUES ( 'Celko', 'Piper Cub' ),
( 'Higgins', 'B-52 Bomber' ), ( 'Higgins', 'F-14 Fighter' ),
( 'Higgins', 'Piper Cub' ),
( 'Jones', 'B-52 Bomber' ), ( 'Jones', 'F-14 Fighter' ),
( 'Smith', 'B-1 Bomber' ), ( 'Smith', 'B-52 Bomber' ),
( 'Smith', 'F-14 Fighter' ),
( 'Wilson', 'B-1 Bomber' ), ( 'Wilson', 'B-52 Bomber' ),
( 'Wilson', 'F-14 Fighter' ), ( 'Wilson', 'F-17 Fighter' ) …Run Code Online (Sandbox Code Playgroud) 我在生成有关此问题的查询时遇到问题。
我有这张小桌子
Tasks(employee_name, task)
Sample Data:
Tasks
------------------
Joe | taskA
Joe | taskB
Ted | taskA
Jim | taskB
Ray | taskA
Ray | taskB
John| taskA
Tim | taskC
Run Code Online (Sandbox Code Playgroud)
我需要找到任务完全相同的所有成对的员工。
例如,使用结果集上方的数据应为:
---------------------
employee1 | employee2
---------------------
Joe | Ray
Ted | John
Run Code Online (Sandbox Code Playgroud)
我正在使用mySQL作为数据库。谢谢!
下面是一个表和简单的 SQL,用于查找恰好出现在两个州的城市
Name State
---- -----
Paris MO
Paris TX
Paris VA
Austin MA
Austin TX
Burling VT
Run Code Online (Sandbox Code Playgroud)
结果:只有奥斯汀才有资格,因为它恰好发生在两个州
SQL
SELECT c1.Name FROM City AS c1
JOIN City AS c2 ON c1.Name = c2.Name AND c1.State <> c2.State
WHERE NOT EXISTS (
SELECT 1 FROM City AS c3
WHERE c1.Name = c3.Name AND c3.State NOT IN (c1.State, c2.State);
Run Code Online (Sandbox Code Playgroud)
我想用关系代数来表达上面的sql。我做了第一部分,它找到了至少在两个州中出现的城市,但无法弄清楚如何表达 NOT EXISTS (...) 部分。我的理解是,我需要在后面的部分中进行一些关系划分。
关系代数(第一部分)
P = 用于重命名的 rho 符号,J = 加入
X1 --> Pc1(City)
X2 --> Pc2(City)
X3 --> X1 …Run Code Online (Sandbox Code Playgroud) sql database relational relational-algebra relational-division
t1
id|entity_type
9|3
9|4
9|5
2|3
2|5
t2
id|entity_type
1|3
1|4
1|5
Run Code Online (Sandbox Code Playgroud)
SELECT t1.id, array_agg(t1.entity_type)
FROM t1
GROUP BY
t1.id
HAVING ARRAY_AGG(t1.entity_type ORDER BY t1.entity_type) =
(SELECT ARRAY_AGG(t2.entity_type ORDER BY t2.entity_type)
FROM t2
WHERE t2.id = 1
GROUP BY t2.id);
Run Code Online (Sandbox Code Playgroud)
结果:
t1.id = 9|array_agg{3,4,5}
Run Code Online (Sandbox Code Playgroud)
我有两张桌子t1和t2。我想获取t1.id数组t1.entity_type等于t2.entity_type数组的值。
在这种情况下一切正常。因为t2.id = 1我收到了t1.id = 9。两者都有相同的数组entity_type:{3,4,5}
现在我不仅想要获得t1.id相等的集合,还想要获得较小的集合。如果我t2这样修改:
t2
id|entity_type
1|3
1|4
Run Code Online (Sandbox Code Playgroud)
并以这种方式修改查询:
SELECT t1.id, array_agg(t1.entity_type) …Run Code Online (Sandbox Code Playgroud) 表:文章
+--------+------+------------+
| id | title| created |
+--------+------+------------+
| 201 | AAA | 1482561011 |
| 202 | BBB | 1482561099 |
| 203 | CCC | 1482562188 |
+--------+------+------------+
Run Code Online (Sandbox Code Playgroud)
表:标签
+-----------+------+
| articleid | tagid|
+-----------+------+
| 201 | 11 |
| 201 | 12 |
| 202 | 11 |
| 202 | 13 |
| 202 | 14 |
+-----------+------+
Run Code Online (Sandbox Code Playgroud)
现在,如果给定3 个标签 id,选择每篇文章同时匹配 3 个标签 id 的最新 10 篇文章的最佳索引设计和查询是什么?
我知道有几种方法可以做到,但我关心的是性能,考虑到每个标签中可能有数万篇文章
TableA
Name Items
A 1
A 2
A 2
A 3
A 3
B 1
B 1
B 2
B 2
C 1
C 2
C 2
C 3
TableB
Items ItemsName
1 One
2 Two
3 Three
Run Code Online (Sandbox Code Playgroud)
我想列出
Name
A
C
Run Code Online (Sandbox Code Playgroud)
因为A和C拥有TableB中的所有项目.B没有3.我想我应该使用"NOT EXISTS".
sql ×10
mysql ×3
postgresql ×3
arrays ×1
c# ×1
count ×1
database ×1
linq ×1
relational ×1
select ×1
sql-server ×1
t-sql ×1