标签: relational-division

SQL如何搜索多对多的关系

我有两个主要的表的数据库noteslabels.它们具有多对多关系(类似于stackoverflow.com对标签的问题).我想知道的是如何使用SQL搜索使用多个标签的笔记?

例如,如果我有一个带有三个标签"one","two"和"three"的注释"test",我有第二个注释"test2",标签为"one"和"two",那么SQL查询将是什么找到与标签"一"和"两"相关的所有音符?

sql search many-to-many relational-division

5
推荐指数
1
解决办法
8374
查看次数

什么是用于选择项/属性列表中具有多个属性的项的SQL语句?

假设我有一个列出项目和属性的表格,

frog    green
cat     furry
frog    nice
cat     4 legs
frog    4 legs
Run Code Online (Sandbox Code Playgroud)

从items列我想选择具有绿色和4个腿属性的唯一对象.在这种情况下,我希望能够回到青蛙对象.执行此操作的最有效查询是什么?

sql relational-division sql-match-all

5
推荐指数
1
解决办法
8390
查看次数

SQL:从类别中获取产品,但也必须在另一组类别中

我目前陷入困境.情景是这样的.我的产品可能与多个类别相关联.数据结构如下所示:

Products Table:
product_id  name 
1           Lemon
2           Kiwis
3           Cheese
Run Code Online (Sandbox Code Playgroud)

产品到类别表

product_id   category_id
1            1
1            2
1            3
2            1
2            3
3            2
3            4
Run Code Online (Sandbox Code Playgroud)

类别表(在查询中不需要,但是在此处添加它以帮助可视化正在发生的事情)

category_id  name
1            Fruit
2            Yellow
3            Round
4            Dairy
Run Code Online (Sandbox Code Playgroud)

我在这里苦苦挣扎的是,最初我想要获得所有水果类别的产品(类别ID 1),但我也想检查水果是否是黄色的.请记住,黄色不会是唯一的过滤器,有时我会想要返回黄色和橙色的水果,但是因为奶酪是黄色的,所以它不能归还,因为它不是水果.然而,为了让事情变得更容易,我总是知道我将把水果类作为基础.

数据库结构不能像opencart数据库结构那样改变.

以下是我的尝试:

SELECT GROUP_CONCAT(DISTINCT p2c2.category_id SEPARATOR ',') as categories 
FROM oc_product_to_category p2c 
LEFT JOIN oc_product p ON (p.product_id = p2c.product_id) 
LEFT JOIN oc_product_to_category p2c2 ON (p.product_id = p2c2.product_id) 
WHERE p2c.category_id IN ('1','2')
Run Code Online (Sandbox Code Playgroud)

这种作品除了它将返回奶酪的事实.

注意:我使用Group Concat,因为在所有这一切的最后,我的目标是返回与这些类别匹配的产品,但根据过滤器,我想从符合此条件的产品中返回另一个类别列表.所以:

场景:

获取符合类别标准的产品返回这些产品的类别.

任何帮助将不胜感激.

mysql left-join group-concat relational-division

5
推荐指数
1
解决办法
3524
查看次数

查找一列中具有相同值的行和另一列中的其他值?

我有一个PostgreSQL数据库,用于将用户存储在users表中,并将对话存储在conversation表中.由于每个用户都可以参与多个对话,并且每个对话都可能涉及多个用户,因此我有一个conversation_user链接表来跟踪哪些用户参与每个对话:

# conversation_user
id  |  conversation_id | user_id
----+------------------+--------
1   |                1 |      32
2   |                1 |       3
3   |                2 |      32
4   |                2 |       3
5   |                2 |       4
Run Code Online (Sandbox Code Playgroud)

在上表中,用户32只与用户3进行一次对话,另一次与3和用户4进行对话.如何编写一个查询,表明只有用户32和用户3之间有对话?

我尝试过以下方法:

SELECT conversation_id AS cid,
       user_id
FROM conversation_user
GROUP BY cid HAVING count(*) = 2
AND (user_id = 32
     OR user_id = 3);

SELECT conversation_id AS cid,
   user_id
FROM conversation_user
GROUP BY (cid HAVING count(*) = 2
AND (user_id …
Run Code Online (Sandbox Code Playgroud)

sql postgresql relational-division

5
推荐指数
1
解决办法
9258
查看次数

SQL选择子集所在的所有行

我确信这个问题有一个答案,但我不喜欢我,因为我是SQL新手,不知道如何提问.

我有这样的数据(这只是简单的简写).这是一个postgres数据库.

table1
id    value
1     111
1     112
1     113
2     111
2     112
2     116
3     111
3     122
3     123
4     126
5     123
5     125
6     111
6     112
6     116

table2
value
111
112
116
Run Code Online (Sandbox Code Playgroud)

我需要返回table1的id,其中table2中的所有值都存在于table1的值中.因此,对于此示例,我的查询将返回2和6.

在SQL中有什么办法吗?或者你可以引导我到一个允许我得到这个结果的数据结构吗?我可以更改任一表的结构,以满足获得此结果的最终需要

非常感谢.对此的答案是节省生命.

sql database postgresql relational-division

4
推荐指数
1
解决办法
7014
查看次数

SQL在连接表上使用条件AND以确保至少匹配两个或多个值

我有一个名为的连接表languages_services基本上连接表serviceslanguages.

我需要找到一个能够同时服务于ENGLISH (language_id=1)和ESPANOL的服务(language_id=2).

table languages_services
------------------------
service_id | language_id
------------------------
 1         |  1
 1         |  2
 1         |  3
 2         |  1 
 2         |  3
Run Code Online (Sandbox Code Playgroud)

使用上面提供的数据,我想测试language_id=1 AND language_id=2结果的样子

QUERY RESULT
------------
service_id
------------
 1
Run Code Online (Sandbox Code Playgroud)

显然它不返回service_id = 2的那个,因为它不为Espanol提供服务.

任何提示都非常感谢!

mysql sql join inner-join relational-division

4
推荐指数
1
解决办法
141
查看次数

Sql IN功能

我有这样的东西作为一个SQL表:

EmplID   SkillID
1780 128
1780 133
2061 128
2068 128

假设我将字符串传递给存储过程,如'128,133'.我有一个split函数,所以sql可能如下所示:

SELECT DISTINCT EmplID
FROM EmplSkills
WHERE SkillID IN(SELECT data FROM dbo.Split(@Skills, ','))
Run Code Online (Sandbox Code Playgroud)

你可以很容易地看到,通过sql语句,我们将得到1780年,2061年和2068年.我真正想要的是获得那些EmplID,他们将128和133都作为技能ID,因此我应该只得到1780.

任何想法如何在没有一堆疯狂连接的情况下接近这个?

非常感谢.

sql relational-division

4
推荐指数
1
解决办法
103
查看次数

MySQL ONLY IN()等效子句

我在这里给出了一个非常抽象的问题版本,所以请耐心等待.我有一个查询,将检查特定的主体是否具有相同类型的某些多个参数.例如,就巧克力而言,男孩有多种选择.但是,我想从桌子上选择那些我提到的巧克力的男孩.不仅不是更少,也不是'喜欢'或不'IN()'.

SELECT boy_id from boys_chocolates WHERE chocolate_id ONLY IN('$string');
Run Code Online (Sandbox Code Playgroud)

..当然'$ string'是一个PHP变量,包含逗号分隔值,只包含那些我想用来吸引男生的巧克力.

我知道这是无效的MySQL语句,但有没有任何有效的相当于此?

编辑:

这是更全面的查询,它在特殊情况下获取记录,但并非总是如此.

SELECT boys.* FROM schools_boys INNER JOIN boys ON boys.boy_id=schools_boys.boy_id
INNER JOIN chocolates_boys a ON a.boy_id=boys.boy_id INNER JOIN schools
ON schools.school_id=schools_boys.school_id WHERE a.chocolate_id IN(1000,1003)
AND 
            EXISTS
            (
                    SELECT 1
                    FROM chocolates_boys b
                    WHERE a.boy_id=b.boy_id
                    GROUP BY boy_id
                    HAVING COUNT(DISTINCT chocolate_id) = '2'
                    )

                GROUP BY schools_boys.boy_id HAVING COUNT(*) = '2'

Boys Table
+--------+-------------+
| id     | boy         |
+--------+-------------+
| 10007  | Boy1        |
| 10008  | …
Run Code Online (Sandbox Code Playgroud)

mysql clause relational-division

4
推荐指数
1
解决办法
2888
查看次数

双重不存在条款是什么意思?

SELECT c.name
FROM   Customer c
WHERE  NOT EXISTS(SELECT w.WID
                  FROM   Woker w
                  WHERE  NOT EXISTS(SELECT la
                                    FROM   look_after la
                                    WHERE  la.CID = c.CID
                                           AND la.WID = w.WID)); 
Run Code Online (Sandbox Code Playgroud)

我不知道代码意味着什么...有谁能告诉我代码的作用?C是一名顾客,他将照顾一名工人.

mysql sql relational-division

4
推荐指数
1
解决办法
3345
查看次数

SQL查询类似于带有AND条件而不是OR的IN where子句

我正在尝试优化我的SQL查询,以便我们不必在JVM上处理响应.

考虑我们有以下表格和条目:

+-----------+-------------+
| Column1   | Column2     |
+-----------+-------------+
|val11      |val21        |
|val11      |val22        |
|val11      |val23        |
|val12      |val21        |
|val12      |val24        |
+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)

现在,我想执行一个查询,这将导致column1s的行映射到Column2s值val21,val22,val23.

类似于IN where子句的东西,但是,当IN where子句在IN子句的值之间搜索OR时,我想在这些值之间搜索AND.

对于IN where子句:

SELECT Column1 from table
WHERE Column2 IN (val21, val22, val23)
Run Code Online (Sandbox Code Playgroud)

将导致val11和val12(因为IN子句将检查val21或val22或val23的数据).

相反,我希望有一些查询,它将检查Column1与val11的所有三个val21,val22,val23的映射.

使用Informix DB.

sql informix select relational-division

4
推荐指数
1
解决办法
1026
查看次数