【问题标题】:In MySQL how to query 2 columns from 1 row?在 MySQL 中如何从 1 行查询 2 列?
【发布时间】:2014-06-04 02:09:29
【问题描述】:

在 MySQL 表中 cardToCard 每次信用卡余额从一张卡转移到另一张卡时都有 1 行。

create table cardToCard (
  id int, 
  dt date,
  card_from int,
  card_to int,
  amount decimal(6,2),
  primary key (id)
);

insert into cardToCard values (1, '2014-01-01', 100, 101, 200.00);
insert into cardToCard values (2, '2014-01-01', 101, 102, 200.00);
insert into cardToCard values (3, '2014-01-01', 102, 103, 200.00);
insert into cardToCard values (4, '2014-01-01', 103, 104, 200.00);
insert into cardToCard values (5, '2014-01-01', 104, 100, 200.00);
insert into cardToCard values (6, '2014-01-01', 99, 104, 200.00);

查询哪张卡被使用了 3 次或以上。

select card, count(*) 'count'
from
  (
  select card_from 'card', dt
  from cardtocard
  union all
  select card_to 'card', dt
  from cardtocard
  ) d
group by card
having count >= 3

结果是正确的。问题是把它写成自加入会更有效吗?

http://sqlfiddle.com/#!2/420e72/1

【问题讨论】:

    标签: mysql sql join union


    【解决方案1】:

    编写此查询的最有效方法可能是从卡片列表开始,然后执行以下操作:

    select c.card,
           ((select count(*) from cardTocard ctc where ctc.card_from = c.card) +
            (select count(*) from cardTocard ctc where ctc.card_to = c.card)
           ) as cnt
    from cards c
    having cnt >= 3;
    

    然后,您需要两个索引:cardTocard(card_from)cardTocard(card_to)

    这应该使用索引进行聚合,这通常比文件排序更快。

    编辑:

    使用您正在使用的结构,可以更快地在子查询以及外部查询中进行聚合:

    select card, sum(cnt) as cnt
    from ((select card_from as car, count(*) as cnt
           from cardtocard
           group by card_from
          ) union all
          (select card_to as card, count(*) as cnt
           from cardtocard
           group by card_to
          )
         ) d
    group by card
    having count >= 3;
    

    这可能会更快,因为子查询的数据量比 union' 在一起要小。

    【讨论】:

    • Picard:“你确定吗,Data 先生?” ;-)
    • @AnthonyRutledge 。 . .不,我不确定。与大多数性能猜想一样,应该在特定系统上进行验证。
    • 问题是c.card不存在,不知道怎么解决。 sqlfiddle.com/#!2/420e72/1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多