MySQL选择所有位置,一个或多个不选

时间:2017-03-20 11:44:17

标签: mysql

表结构和数据(我知道IP /域字段中的数据可能没有多大意义,但这仅用于说明目的):

rec_id | account_id | product_id | ip          | domain          | some_data
----------------------------------------------------------------------------
1      | 1          | 1          | 192.168.1.1 | 127.0.0.1/test  | abc
2      | 1          | 1          | 192.168.1.1 | 127.0.0.1/other | xyz
3      | 1          | 1          | 192.168.1.2 | 127.0.0.1/test  | ooo

表格具有ip_domainip字段组合的唯一索引domain(因此两个字段中的值相同的记录不可存在)。

在每种情况下,我都知道account_id, product_id, ip, domain字段的值,并且我需要获取具有SAME account_id, product_id值且其中一个(或两个)ip, domain个值的其他行不同。

示例:我知道account_id=1product_id=1ip=192.168.1.1domain=127.0.0.1/test(所以它匹配rec_id 1),我需要选择带ID的记录2和3(因为记录2有different domain而记录3有different ip)。

所以,我使用了查询:

SELECT * FROM table WHERE 
account_id='1' AND product_id='1' AND ip!='192.168.1.1' AND domain!='127.0.0.1/test'

当然,它返回0行。看着mysql multiple where and where not in并写道:

SELECT * FROM table WHERE 
account_id='1' AND product_id='1' AND installation_ip NOT IN ('192.168.1.1') AND installation_domain NOT IN ('127.0.0.1/test')

我的猜测是这个查询是相同的(只是格式化不同的方式),所以再次0行。还找到了一些例子,但没有一个在我的案例中有效。

3 个答案:

答案 0 :(得分:3)

语法正确,但您使用了错误的逻辑操作

SELECT  *
FROM    table
WHERE   account_id='1' AND product_id='1' AND
        (ip != '192.168.1.1' OR domain != '127.0.0.1/test')

答案 1 :(得分:0)

Select * from table
  Where ROWID <> myRowid
    And account_id = '1'
    And product_id = '1';

myRowid是dbms为每条记录提供的唯一ID,在这种情况下,您需要使用select语句检索它,然后在使用此select时将其传回。除了您选择的那个之外,这将返回account_id = 1和product_id = 1的所有行。

答案 2 :(得分:0)

如果您的输入未定义/或者您想要列表,那么您可能会看到Group By子句。此外,您可以查看group_concat

查询类似于:

SELECT ACCOUNT_ID, PRODUCT_ID, GROUP_CONCAT(DISTINCT IP||'|'||DOMAIN, ','), COUNT(1)
FROM TABLE
GROUP BY ACCOUNT_ID, PRODUCT_ID

P.S。:我没有安装mysql因此查询语法未经验证