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 DESTR2339442 和 FERW23445212
我需要做的是删除所有发生 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)
嗨,我有这个问题,我无法解决。
我正在使用自动完成搜索来尝试从数据库中获取唯一值 table,并且我正在使用以下语句。
SELECT DISTINCT trackingChipNumber FROM `main` WHERE `trackingChipNumber` LIKE ?
----------
trackingChipNumber|Fate
----------------------------
DESTR2339442 |Relocated
FERW23445212 |Relocated
DESTR2339442 |Died
----------------------------
随着您的键入,它会缩小记录的搜索范围。目前它 returns DESTR2339442 和 FERW23445212
我需要做的是删除所有发生 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)