比较来自世界各地的卖家的域名和 IT 服务价格

穿过B. MySQL

我有两个表,记录和数据。 记录有几个字段 /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 DISTINCT records.id 
FROM records
WHERE records.firstname IN /
select id from data where value = 'john'
/ AND records.lastname IN /
select id from data where value = 'smith'
/

二哥

赞同来自:

我认为这种方法更容易遵循,但随之而来,有一些开销成本,因为最初加载了大量重复的记录。 我在数据库中使用它 10000-50000 记录,通常越过 5 请求和性能是可接受的。

你所做的一切都是 "UNION ALL" 您想要交叉的每个请求,并查看每次都有哪些。


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, 最终包装查询将包括它。

郭文康

赞同来自:

使用连接,而是:


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


测试数据可能对海报无用,但对想要检查决策的选民可能有用,以确保他们正常工作,或者想要呈现答案的人,以便他们可以测试自己的答案。

奔跑吧少年

赞同来自:

SELECT t.id FROM table t WHERE NOT EXISTS /SELECT t2.id, FROM table2 t2 WHERE t2.id = t1.id/


https://dev.mysql.com/doc/refm ... .html

二哥

赞同来自:

完全替代 INTERSECT 在MySQL中,这是一个内部连接:


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/

江南孤鹜

赞同来自:

只要 Mysql 不支持 INTERSECT, 你可能有 2 备择方案:

inner join



in

. 这个决定,与



:


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/;

要回复问题请先登录注册