SQL:选择在特定列中具有特定值的帐户的所有行

时间:2016-08-05 06:35:24

标签: mysql sqlyog

我在表1中有一些数据:

ID1     ID2     Col3   Col4 ...
x1      a1       a  
x1      a1       b  
x1      a2       c  
x2      a1       a
x2      a2       b
x2      a2       c
x3      a3       a
x3      a3       d   
x4      a3       d

我想显示在Col3字段中有'a'的所有帐户行(ID1 + ID2)。 所以输出应该看起来像

ID1     ID2     Col3   Col4 ...
x1      a1       a  
x1      a1       b    
x2      a1       a
x3      a3       a
x3      a3       d

这是我正在使用的查询:

SELECT * 
FROM t1 table1
WHERE EXISTS
(
   SELECT t2.ID1, t2.ID2
   FROM t2 table1
   where t1.ID1 = t2.ID1
   AND t1.ID2 = t2.ID2
   AND t2.Col3 = 'a'
)

此查询花费了大量时间。有更快的方法吗?

谢谢!

我找到了一个解决方案: 我工作的表有数百万行。因此查询花了很多时间。我能够通过在两个表上执行主键索引来提高速度。

谢谢! :)

4 个答案:

答案 0 :(得分:0)

你能更好地解释你想要的吗?因为你的示例结果看起来不像你说的那样(col3中只有'a')并且你的查询是多余的我认为这个查询会产生相同的结果:

SELECT * FROM t1 table1

您将使用

获取所有结果
SELECT * FROM table1 WHERE col3 = 'a'

答案 1 :(得分:0)

首先尝试:

SELECT DISTINCT a.*
FROM table1 AS a
JOIN table1 AS b
WHERE a.id1 = b.id1
AND   a.id2 = b.id2 
AND   (a.col3 = 'a' or b.col3 = 'a')

如果不想要,请尝试以下原始:

SELECT *
FROM table1 AS a
JOIN table1 AS b
WHERE a.id1 = b.id1
AND   a.id2 = b.id2 
AND   (a.col3 = 'a' or b.col3 = 'a')

答案 2 :(得分:0)

我认为这可能是解决方案

var messageReceivedCallBack = {
    onMessageReceived: function (message) {
        console.log('Message received ' + message);
    }
};

答案 3 :(得分:0)

解决方案1 ​​

从第1列中选择并匹配第2列中的行,但仅当表1包含col3中的正确数据时

    SELECT ID1, ID2, Col3 FROM table1 LEFT JOIN table2 ON Table1.col3 = "a";

解决方案2

从第1列中选择并匹配第2列中的行,但仅当表1和表2包含col3中的正确数据时

    SELECT ID1, ID2, Col3 FROM table1 LEFT JOIN table2 ON Table1.col3 = "a" AND Table2.col3 = a;