Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
在MySQL中相交_Mysql_Sql_Intersect - Fatal编程技术网

在MySQL中相交

在MySQL中相交,mysql,sql,intersect,Mysql,Sql,Intersect,我有两个表,记录和数据。记录有多个字段firstname、lastname等。。每个字段都是存储实际值的数据表的外键。我需要搜索多个记录字段 下面是一个使用INTERSECT的查询示例,但我需要一个在MySQL中工作的查询 SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john" INTERSECT SELECT records.id FROM records, d

我有两个表,记录和数据。记录有多个字段firstname、lastname等。。每个字段都是存储实际值的数据表的外键。我需要搜索多个记录字段

下面是一个使用INTERSECT的查询示例,但我需要一个在MySQL中工作的查询

SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john"
INTERSECT
SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith"

感谢您的帮助。

您可以使用内部联接筛选其他表中具有匹配行的行:

SELECT DISTINCT records.id 
FROM records
INNER JOIN data d1 on d1.id = records.firstname AND data.value = "john"
INNER JOIN data d2 on d2.id = records.lastname AND data.value = "smith"
许多其他备选方案之一是in条款:

请改用联接:

SELECT records.id
FROM records
JOIN data AS D1 ON records.firstname = D1.id
JOIN data AS D2 ON records.lastname = D2.id
WHERE D1.value = 'john' and D2.value = 'smith'
以下是一些测试数据:

CREATE TABLE records (id INT NOT NULL, firstname INT NOT NULL, lastname INT NOT NULL);
INSERT INTO records (id, firstname, lastname) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 2, 1),
(4, 2, 2);

CREATE TABLE data (id INT NOT NULL, value NVARCHAR(100) NOT NULL);
INSERT INTO data (id, value) VALUES
(1, 'john'),
(2, 'smith');
预期结果:

2

测试数据可能对海报没有用处,但对于希望检查解决方案是否正确工作的选民,或者想要提交答案以便测试自己答案的人,可能有用。

我认为这种方法更容易遵循,但这会带来一点开销,因为您最初加载了大量重复记录。我在一个有10000-50000条记录的数据库上使用它,通常会交叉5个查询,性能是可以接受的

您所要做的就是合并所有要相交的查询,并查看每次得到的查询

SELECT * From (

    (Select data1.* From data1 Inner Join data2 on data1.id=data2.id where data2.something=true)
    Union All
    (Select data1.* From data1 Inner Join data3 on data1.id=data3.id where data3.something=false)

) As tbl GROUP BY tbl.ID HAVING COUNT(*)=2 

因此,如果我们在两个查询中都得到相同的记录,那么它的计数将是2,最终的环绕查询将包括它。

MYSQL中INTERSECT的一般替代方法是内部连接:

SELECT DISTINCT * FROM 
(SELECT f1, f2, f3... FROM table1 WHERE f1>0)
INNER JOIN
(SELECT f1, f2, f3... FROM table2 WHERE f1>0)
USING(primary_key)
或者具体针对您的情况:

SELECT DISTINCT * FROM 
(SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john") query1
INNER JOIN
(SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith") query2
USING (id)
从不存在的表t中选择t.id从表2 t2中选择t2.id,其中t2.id=t1.id


由于Mysql不支持INTERSECT,您可能有两种选择:内部连接和in。这是一个具有以下功能的解决方案:


我参加聚会有点晚了,但我认为完全模仿INTERSECT最干净、最好的方式是:


看看这个:@Mike Atlas:这与连接无关。这可以通过这种方式解决,但杰夫的博客文章并不相关。是的,它确实与加入有关,而且是相关的。它解释了哪个SQL连接等效于两个数据内部连接的交集。由此,Jeremy应该能够找出交叉点的标准SQL语法。我只是把它作为一个评论,因为其他人给出了确切的答案。检查@ Djebel回答,在考虑ReordFrestNew的情况下,LaSTNEX只有A、B和DATAFIRTSTND,LASSTRONT只有A、C和D、B。
SELECT DISTINCT * FROM 
(SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john") query1
INNER JOIN
(SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith") query2
USING (id)
SELECT records.id FROM records, data 
WHERE data.id = records.firstname AND data.value = "john"
    AND records.id in (SELECT records.id FROM records, data 
    WHERE data.id = records.lastname AND data.value = "smith);
SELECT * FROM
( SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john" ) x1
NATURAL JOIN
( SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith" ) x2