需要SELECT语句的帮助吗
我将记录和可附加到记录的SearchTag之间的关系表示为:需要SELECT语句的帮助吗,select,mysql,Select,Mysql,我将记录和可附加到记录的SearchTag之间的关系表示为: TABLE RECORDS id name TABLE SEARCHTAGS id recordid name 我希望能够选择记录的基础上,他们的搜索标签。例如,我希望能够选择具有SearchTag的所有记录: (1 OR 2 OR 5) AND (6 OR 7) AND (10) 使用上述数据结构,我不确定如何构造SQL来实现这一点 有什么建议吗 谢谢 不知道如何在mysql中实现,但在t-sql中,您可以执行以下操作: S
TABLE RECORDS
id
name
TABLE SEARCHTAGS
id
recordid
name
我希望能够选择记录的基础上,他们的搜索标签。例如,我希望能够选择具有SearchTag的所有记录:
(1 OR 2 OR 5) AND (6 OR 7) AND (10)
使用上述数据结构,我不确定如何构造SQL来实现这一点
有什么建议吗
谢谢 不知道如何在mysql中实现,但在t-sql中,您可以执行以下操作:
SELECT id, name FROM RECORDS where id in (SELECT recordid from SEARCHTAGS where id in (1,2,5,6,7,10))
我可能不完全理解你的问题。。。但我已经尽力了。试试:
SELECT R.*
FROM RECORDS R, SEARCHTAGS S
WHERE R.id == S.recordid
AND S.name in (1,2,5,6,7,10);
不知道您是否需要S.name或S.id,但这是一个示例。您可能需要尝试以下操作:
SELECT
id, name
FROM
records
WHERE
EXISTS (
SELECT 1 FROM searchtags WHERE recordid = records.id AND id IN (1, 2, 5)
)
AND EXISTS (
SELECT 1 FROM searchtags WHERE recordid = records.id AND id IN (6, 7)
)
AND EXISTS (
SELECT 1 FROM searchtags WHERE recordid = records.id AND id IN (10)
)
SELECT r.id, r.name
FROM records r
WHERE EXISTS (SELECT NULL FROM searchtags WHERE recordid = r.id AND id IN (1, 2, 5)) AND
EXISTS (SELECT NULL FROM searchtags WHERE recordid = r.id AND id IN (6, 7)) AND
EXISTS (SELECT NULL FROM searchtags WHERE recordid = r.id AND id IN (10));
测试用例:请注意,只有记录1和4将满足查询条件
CREATE TABLE records (id int, name varchar(10));
CREATE TABLE searchtags (id int, recordid int);
INSERT INTO records VALUES (1, 'a');
INSERT INTO records VALUES (2, 'b');
INSERT INTO records VALUES (3, 'c');
INSERT INTO records VALUES (4, 'd');
INSERT INTO searchtags VALUES (1, 1);
INSERT INTO searchtags VALUES (2, 1);
INSERT INTO searchtags VALUES (6, 1);
INSERT INTO searchtags VALUES (10, 1);
INSERT INTO searchtags VALUES (1, 2);
INSERT INTO searchtags VALUES (2, 2);
INSERT INTO searchtags VALUES (3, 2);
INSERT INTO searchtags VALUES (1, 3);
INSERT INTO searchtags VALUES (10, 3);
INSERT INTO searchtags VALUES (5, 4);
INSERT INTO searchtags VALUES (7, 4);
INSERT INTO searchtags VALUES (10, 4);
结果:
+------+------+
| id | name |
+------+------+
| 1 | a |
| 4 | d |
+------+------+
2 rows in set (0.01 sec)
我第一次误读了这个问题,以为它是在问我
(1 AND 2 AND 5) OR (6 AND 7) OR (10)
而不是正确的
(1 OR 2 OR 5) AND (6 OR 7) AND (10)
到目前为止,所有的答案都集中在回答具体的例子,而不是解决更一般的问题“假设我下次想要一套不同的标准”
实际问题
对于实际问题(查询1),我没有比所选答案更好的答案了:
这可以写成SearchTags表的3个别名的连接
替代问题
有几种方法可以回答这个问题——我认为这是最简洁和可扩展的方法。显然,这一项(10)很简单(查询2):
这两项(6或7)可以通过(查询3)完成:
这三项(1、2、5)可以通过(查询4)完成:
整个集合可以是三个术语的联合体
推广解决方案
此解决方案的缺点是,必须为每一组项手动创建SQL。
如果要自动化“SQL生成”,则需要控制数据(一组有趣的搜索标记)在表中:
CREATE TABLE InterestingTags(GroupID INTEGER, TagID INTEGER);
INSERT INTO InterestingTags(1, 1);
INSERT INTO InterestingTags(1, 2);
INSERT INTO InterestingTags(1, 5);
INSERT INTO InterestingTags(2, 6);
INSERT INTO InterestingTags(2, 7);
INSERT INTO InterestingTags(3, 10);
对于要求“(1或2或5)和(…)”(合取范式)的查询,您可以编写(query 5):
这将检查给定记录的不同“有趣的标记组”的数量是否等于“有趣的标记组”的总数
对于请求“(1、2和5)或(…)”(析取范式)的查询,您可以编写一个带有兴趣标记的联接,并检查记录的条目数是否与标记组的条目数相同(query 6):
测试数据
我从Daniel Vassalo的答案中获取了测试数据,并添加了一些额外的值:
CREATE TABLE records (id int, name varchar(10));
CREATE TABLE searchtags (id int, recordid int);
INSERT INTO records VALUES (1, 'a');
INSERT INTO records VALUES (2, 'b');
INSERT INTO records VALUES (3, 'c');
INSERT INTO records VALUES (4, 'd');
INSERT INTO records VALUES (11, 'A11');
INSERT INTO records VALUES (21, 'B12');
INSERT INTO records VALUES (31, 'C13');
INSERT INTO records VALUES (41, 'D14');
INSERT INTO records VALUES (51, 'E15');
INSERT INTO records VALUES (61, 'F16');
INSERT INTO searchtags VALUES (1, 1);
INSERT INTO searchtags VALUES (2, 1);
INSERT INTO searchtags VALUES (6, 1);
INSERT INTO searchtags VALUES (10, 1);
INSERT INTO searchtags VALUES (1, 2);
INSERT INTO searchtags VALUES (2, 2);
INSERT INTO searchtags VALUES (3, 2);
INSERT INTO searchtags VALUES (1, 3);
INSERT INTO searchtags VALUES (10, 3);
INSERT INTO searchtags VALUES (5, 4);
INSERT INTO searchtags VALUES (7, 4);
INSERT INTO searchtags VALUES (10, 4);
INSERT INTO searchtags VALUES (1, 11);
INSERT INTO searchtags VALUES (2, 11);
INSERT INTO searchtags VALUES (5, 11);
INSERT INTO searchtags VALUES (6, 21);
INSERT INTO searchtags VALUES (7, 21);
INSERT INTO searchtags VALUES (10, 31);
INSERT INTO searchtags VALUES (1, 41);
INSERT INTO searchtags VALUES (6, 41);
INSERT INTO searchtags VALUES (10, 41);
INSERT INTO searchtags VALUES (2, 51);
INSERT INTO searchtags VALUES (5, 51);
INSERT INTO searchtags VALUES (10, 51);
INSERT INTO searchtags VALUES (7, 61);
INSERT INTO searchtags VALUES (2, 61);
INSERT INTO searchtags VALUES (1, 61);
CREATE TABLE InterestingTags(GroupID INTEGER, TagID INTEGER);
INSERT INTO InterestingTags VALUES(1, 1);
INSERT INTO InterestingTags VALUES(1, 2);
INSERT INTO InterestingTags VALUES(1, 5);
INSERT INTO InterestingTags VALUES(2, 6);
INSERT INTO InterestingTags VALUES(2, 7);
INSERT INTO InterestingTags VALUES(3, 10);
测试结果
我得到的结果是:
查询1
1 a
4 d
41 D14
查询2
1 a
3 c
4 d
31 C13
41 D14
51 E15
查询3
21 B12
查询4
11 A11
查询5
1 a
41 D14
4 d
查询6
4 d
31 C13
3 c
1 a
41 D14
51 E15
显然,如果我想要以特定的顺序输出,我会在查询中添加orderby子句。
(1或2或5)和(6或7)以及(10)
!=(1或2或5或6或7或10)
似乎很多人都犯了这个错误
CREATE TABLE records (id int, name varchar(10));
CREATE TABLE searchtags (id int, recordid int);
INSERT INTO records VALUES (1, 'a');
INSERT INTO records VALUES (2, 'b');
INSERT INTO records VALUES (3, 'c');
INSERT INTO records VALUES (4, 'd');
INSERT INTO records VALUES (11, 'A11');
INSERT INTO records VALUES (21, 'B12');
INSERT INTO records VALUES (31, 'C13');
INSERT INTO records VALUES (41, 'D14');
INSERT INTO records VALUES (51, 'E15');
INSERT INTO records VALUES (61, 'F16');
INSERT INTO searchtags VALUES (1, 1);
INSERT INTO searchtags VALUES (2, 1);
INSERT INTO searchtags VALUES (6, 1);
INSERT INTO searchtags VALUES (10, 1);
INSERT INTO searchtags VALUES (1, 2);
INSERT INTO searchtags VALUES (2, 2);
INSERT INTO searchtags VALUES (3, 2);
INSERT INTO searchtags VALUES (1, 3);
INSERT INTO searchtags VALUES (10, 3);
INSERT INTO searchtags VALUES (5, 4);
INSERT INTO searchtags VALUES (7, 4);
INSERT INTO searchtags VALUES (10, 4);
INSERT INTO searchtags VALUES (1, 11);
INSERT INTO searchtags VALUES (2, 11);
INSERT INTO searchtags VALUES (5, 11);
INSERT INTO searchtags VALUES (6, 21);
INSERT INTO searchtags VALUES (7, 21);
INSERT INTO searchtags VALUES (10, 31);
INSERT INTO searchtags VALUES (1, 41);
INSERT INTO searchtags VALUES (6, 41);
INSERT INTO searchtags VALUES (10, 41);
INSERT INTO searchtags VALUES (2, 51);
INSERT INTO searchtags VALUES (5, 51);
INSERT INTO searchtags VALUES (10, 51);
INSERT INTO searchtags VALUES (7, 61);
INSERT INTO searchtags VALUES (2, 61);
INSERT INTO searchtags VALUES (1, 61);
CREATE TABLE InterestingTags(GroupID INTEGER, TagID INTEGER);
INSERT INTO InterestingTags VALUES(1, 1);
INSERT INTO InterestingTags VALUES(1, 2);
INSERT INTO InterestingTags VALUES(1, 5);
INSERT INTO InterestingTags VALUES(2, 6);
INSERT INTO InterestingTags VALUES(2, 7);
INSERT INTO InterestingTags VALUES(3, 10);
1 a
4 d
41 D14
1 a
3 c
4 d
31 C13
41 D14
51 E15
21 B12
11 A11
1 a
41 D14
4 d
4 d
31 C13
3 c
1 a
41 D14
51 E15