我有一个看起来像这样的表(例子)
+----+----------+----------+---------------+
| id | objectId | filterId | filterValueId |
+----+----------+----------+---------------+
| 1 | 55 | 111 | 2345 |
| 2 | 55 | 113 | 2567 |
| 3 | 55 | 113 | 2568 |
| 4 | 58 | 111 | 2347 |
| 5 | 58 | 115 | 2499 |
+----+----------+----------+---------------+
现在,我查询了一些LEFT JOIN(主对象表,这个过滤表,元表和其他几个)。我正在创建前端过滤,我已经达到了一定程度,但是我遇到了一个问题。
当我在队列中有两个过滤器时(假设 filterId => filterValueId 111 => 2345和113 => 2567)。 使用查询
SELECT ojectId IN tableName
WHERE (filterId = 111 AND filterValueId = 2345)
AND (filterId = 113 AND filterValeId = 2567)
我无法获取信息,objectId 55符合这两个标准。至少不是在单个查询中。我知道,这是有道理的,但有没有办法让MySQL给出这样的结果? (这个请求/程序是否有一些我可以用于谷歌搜索的技术名称?)
或者最好将此类过滤拆分为多个查询,然后将结果相交并得出每个结果中的结果?
很抱歉以错误的方式使用技术术语,希望你能理解我想说的话:)
非常感谢。
答案 0 :(得分:0)
在谷歌搜索没有特殊名称。您刚刚使用AND
编写了获取sql以仅获取一条记录而不是两条记录。您应该使用OR
。
并将IN
更正为FROM
。
SELECT ojectId
FROM tableName
WHERE
(filterId = 111 AND filterValueId = 2345)
OR (filterId = 113 AND filterValeId = 2567)
或者最好将此类过滤拆分为多个查询和 然后交叉结果,并获得每个中的结果 导致?
NO!让数据库只努力工作一次。立即给它所有过滤器。无需拆分查询。
答案 1 :(得分:0)
考虑以下内容......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,objectId INT NOT NULL
,filterId INT NOT NULL
,filterValueId INT NOT NULL
);
INSERT INTO my_table VALUES
(1,55,111,2345),
(2,55,113,2567),
(3,55,113,2568),
(4,58,111,2347),
(5,58,115,2499);
SELECT objectid
FROM my_table
WHERE (filterid,filtervalueid) IN ((111,2345),(113,2567))
GROUP
BY objectid
HAVING COUNT(id = 2);
+----------+
| objectid |
+----------+
| 55 |
+----------+