MYSQL 选择 DISTINCT 值 WHERE

MYSQL selecting DISTINCT value WHERE

嗨,我有这个问题,我无法解决。

我正在使用自动完成搜索来尝试从数据库中获取唯一值 table,并且我正在使用以下语句。

SELECT DISTINCT trackingChipNumber FROM `main` WHERE `trackingChipNumber` LIKE ?
----------
trackingChipNumber|Fate
----------------------------
DESTR2339442      |Relocated
FERW23445212      |Relocated
DESTR2339442      |Died
----------------------------

随着您的键入,它会缩小记录的搜索范围。目前它 returns DESTR2339442FERW23445212

我需要做的是删除所有发生 Fate of Died 的值。

搜索应该只 return FERW23445212 因为 DESTR2339442 已经去世了。

我不知道该怎么做。

TIA

试试这个

SELECT DISTINCT t1.trackingChipNumber 
FROM `main` t1
left join `main` t2 on t2.trackingChipNumber = t1.trackingChipNumber and t2.fate = 'Died'
WHERE t2.fate is null and t1.trackingChipNumber LIKE ?

我的回答和@Ronny的回答是一样的。我还为您的 SQL 添加了一些性能转向建议。我的所有 sql 都在 Mysql 社区服务器 5.6.48 上得到验证。

请尝试以下SQL。

select
    distinct t1.trackingChipNumber
from main as t1 left join
    main as t2
on t2.trackingChipNumber = t1.trackingChipNumber and t2.fate in ('Died')
where t1.trackingChipNumber LIKE "%" and t2.fate is null

我不确定你是如何为这个 table 添加索引的,也不知道这个 table 的定义是什么。 以下是我用来创建这个table的sql:

create table `main` (
  `id` int(11) not null auto_increment primary key,
  `trackingChipNumber` varchar(20) not null,
  `fate` varchar(10) not null,
  KEY `index_tcnum_fate` (`trackingChipNumber`, `fate`)) engine = InnoDB;

我不确定这是否适合您的情况table,但是,添加此类索引后,我的沙箱中的查询可能会更快。对应的执行计划如下

在添加索引之前,所有数据将在main table.

中扫描两次
mysql> explain select
    ->         distinct t1.trackingChipNumber
    ->     from main as t1 left join
    ->         main as t2
    ->     on t2.trackingChipNumber = t1.trackingChipNumber and t2.fate in ('Died')
    ->     where t1.trackingChipNumber LIKE "%" and t2.fate is null;
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                                                    |
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------------------------------------------------+
|  1 | SIMPLE      | t1    | ALL  | NULL          | NULL | NULL    | NULL |    3 | Using where; Using temporary                                             |
|  1 | SIMPLE      | t2    | ALL  | NULL          | NULL | NULL    | NULL |    3 | Using where; Not exists; Distinct; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------------------------------------------------+
2 rows in set (0.00 sec)

添加索引后,将使用索引

mysql> explain select
->         distinct t1.trackingChipNumber
->     from main as t1 left join
->         main as t2
->     on t2.trackingChipNumber = t1.trackingChipNumber and t2.fate in ('Died')
->     where t1.trackingChipNumber LIKE "%" and t2.fate is null;
+----+-------------+-------+-------+------------------+------------------+---------+-------------------------------+------+------------------------------------------------+
| id | select_type | table | type  | possible_keys    | key              | key_len | ref                           | rows | Extra                                          |
+----+-------------+-------+-------+------------------+------------------+---------+-------------------------------+------+------------------------------------------------+
|  1 | SIMPLE      | t1    | index | index_tcnum_fate | index_tcnum_fate | 34      | NULL                          |    3 | Using where; Using index; Using temporary      |
|  1 | SIMPLE      | t2    | ref   | index_tcnum_fate | index_tcnum_fate | 22      | lzytest.t1.trackingChipNumber |    1 | Using where; Not exists; Using index; Distinct |
+----+-------------+-------+-------+------------------+------------------+---------+-------------------------------+------+------------------------------------------------+
2 rows in set (0.00 sec)