Mysql 结果集。。。我需要将其保留在最后的WHERE子句中,因为您有一个“join”到“b”表,但“b”或“c”都可以限定。您的缩写数据隐藏了您想要得到的内容,而这些内容可能在实际表/列引用中更容易解决。将来,您可能会从原始查询中隐藏具有泛型“a”、“b”和“c”

Mysql 结果集。。。我需要将其保留在最后的WHERE子句中,因为您有一个“join”到“b”表,但“b”或“c”都可以限定。您的缩写数据隐藏了您想要得到的内容,而这些内容可能在实际表/列引用中更容易解决。将来,您可能会从原始查询中隐藏具有泛型“a”、“b”和“c”,mysql,sql,join,query-optimization,left-join,Mysql,Sql,Join,Query Optimization,Left Join,结果集。。。我需要将其保留在最后的WHERE子句中,因为您有一个“join”到“b”表,但“b”或“c”都可以限定。您的缩写数据隐藏了您想要得到的内容,而这些内容可能在实际表/列引用中更容易解决。将来,您可能会从原始查询中隐藏具有泛型“a”、“b”和“c”表的表的上下文。即使某些东西可能有“机密”信息,大多数人也会给出一般的东西。。。即使像“Customer.ID”或“Account.ID”等不知道上下文,其他人(包括我自己)也很难帮助你。此外,通过了解数据,找到最有效的查询(子集/键基)应该始


结果集。。。我需要将其保留在最后的WHERE子句中,因为您有一个“join”到“b”表,但“b”或“c”都可以限定。您的缩写数据隐藏了您想要得到的内容,而这些内容可能在实际表/列引用中更容易解决。将来,您可能会从原始查询中隐藏具有泛型“a”、“b”和“c”表的表的上下文。即使某些东西可能有“机密”信息,大多数人也会给出一般的东西。。。即使像“Customer.ID”或“Account.ID”等不知道上下文,其他人(包括我自己)也很难帮助你。此外,通过了解数据,找到最有效的查询(子集/键基)应该始终列在第一位。。。此外,添加直接连接有助于强制执行您选择的链接表的顺序。
SELECT a.id
FROM a
JOIN b ON a.id=b.id
LEFT JOIN c ON a.id=c.id
WHERE
   (b.c1='12345' OR c.c1='12345')
   AND (a.c2=0 OR b.c3=1)
   AND a.c4='active'
GROUP BY a.id;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: a
         type: ref
possible_keys: PRIMARY(id),c4,c2
          key: c4
      key_len: 1
          ref: const
         rows: 80775
        Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: c
         type: ref
possible_keys: id_c1_unique,id
          key: id_c1
      key_len: 4
          ref: database.a.id
         rows: 1
        Extra: Using index
*************************** 3. row ***************************
           id: 1
  select_type: SIMPLE
        table: b
         type: ref
possible_keys: id_c1_unique,id,c1,c3
          key: id
      key_len: 4
          ref: database.a.id
         rows: 2
        Extra: Using where
CREATE TABLE `a` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `c2` tinyint(1) NOT NULL,
  `c4` enum('active','pending','closed') NOT NULL,
  PRIMARY KEY (`id`),
  KEY `c2` (`c2`)
  KEY `c4` (`c4`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `b` (
    `b_id` int(11) NOT NULL AUTO_INCREMENT,
    `id` int(11) NOT NULL DEFAULT '0',
    `c1` int(11) NOT NULL,
    `c3` tinyint(1) NOT NULL,
    PRIMARY KEY (`b_id`),
    UNIQUE KEY `id_c1_unique` (`id`,`c1`),
    KEY `c1` (`c1`),
    KEY `c3` (`c3`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `c` (
    `c_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `id` int(11) NOT NULL,
    `c1` int(11) NOT NULL,
    PRIMARY KEY (`c_id`),
    UNIQUE KEY `id_c1_unique` (`id`,`c1`),
    KEY `id` (`id`),
    KEY `c1` (`c1`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
select STRAIGHT_JOIN 
      distinct a.ID
   from
      a
         join b
            on a.ID = b.ID
         left join c
            on a.id = c.id
            and c.c1 = '12345'
   where
          a.C4 = 'active'
      and ( a.c2 = 0 or b.c3 = 1 )
      and ( b.c1 = '12345' or c.c1='12345' )
SELECT a.id
FROM a
LEFT JOIN c ON a.id=c.id
GROUP BY a.id;
SELECT a.id
FROM c
LEFT JOIN a ON c.id=a.id
GROUP BY a.id;