Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要SELECT语句的帮助吗_Select_Mysql - Fatal编程技术网

需要SELECT语句的帮助吗

需要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

我将记录和可附加到记录的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中,您可以执行以下操作:

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