MySQL,我如何只根据其他行数据选择行?

时间:2013-10-29 20:34:07

标签: mysql

好的,这是交易,我有一个stats表,其中有不同的类型,我只想选择一行,如果它有一个前一个(不是直接上一个)行,它有一些匹配的数据(哈希)并且是唯一的基于另一个列值。

在以下示例中,我们只需要获取SALE行

这个例子应该有所帮助:

id    link_id   member_id   stat_type   hash
----------------------------------------------
108   41        82          SALE        fffff
107   41        82          CLICK       fffff
106   41        82          CLICK       eeeee
105   41        67          SALE        ddddd
104   41        67          CLICK       ddddd
103   41        35          SALE        ccccc
102   41        35          CLICK       bbbbb
101   41        35          CLICK       aaaaa

我想要回到这里的唯一一行是member_id = 67,因为该成员之前唯一的CLICK to link_id 41具有相同的哈希值。成员82和35没有被选中,因为他们都有一个先前点击link_id 41与不匹配的哈希值。

查询结果应为:

id    link_id   member_id   stat_type   hash
----------------------------------------------
105   41        67          SALE        ddddd

TIA

2 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,那么您首先需要按link_idmember_id对表进行分组,对那些仅包含一个不同hash的组进行过滤,以及然后将结果返回到您的表中以获取所有匹配的SALE记录:

SELECT * FROM my_table NATURAL JOIN (
  SELECT   link_id, member_id
  FROM     my_table
  GROUP BY link_id, member_id
  HAVING   COUNT(DISTINCT hash) = 1
) t WHERE stat_type = 'SALE'

sqlfiddle上查看。

答案 1 :(得分:0)

获得此结果的一种方法是使用反连接模式。

SELECT r.*
  FROM mytable r
  LEFT
  JOIN ( SELECT t.member_id
              , t.link_id
              , t.hash
           FROM mytable t
          GROUP
             BY t.member_id
              , t.link_id
              , t.hash
       ) s
    ON s.member_id = r.member_id
   AND s.link_id   = r.link_id
   AND NOT (s.hash = r.hash)
 WHERE r.stat_type = 'SALE'
   AND s.member_id IS NULL

作为s别名的内联视图(派生表)获取每个member_id和link_id的所有不同哈希值。它保留在表中所有具有stat_type='SALE'的行,具有匹配的member_id和link_id,以及不匹配的哈希值。

“技巧”是s.member_id IS NULL谓词。找到匹配的任何行(即不匹配的HASH将为s.member_id设置非空值。只有没有匹配的行才会返回NULL(由于LEFT JOIN)。