MYSQL выбор DISTINCT value WHERE - PullRequest
0 голосов
/ 14 июля 2020

Привет, у меня возникла эта проблема, я не могу решить.

Я использую поиск с автозаполнением, чтобы попытаться получить уникальное значение из таблицы базы данных, и я использую следующий оператор.

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

По мере ввода сужается поиск записей. В настоящее время он возвращает DESTR2339442 и FERW23445212

Что мне нужно сделать, так это удалить все значения, в которых произошла Fate of Died.

Поиск должен только вернуть FERW23445212 как DESTR2339442 уже скончался.

Я просто не могу понять, как это сделать.

TIA

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Мой ответ такой же, как и у @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

Я не уверен, как вы добавляете индекс для эта таблица и определение этой таблицы тоже. Вот что я использовал для создания этой таблицы 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;

Я не уверен, подходит ли это для вашего случая, однако после добавления такого индекса запрос в моей песочнице может будь быстрее. Соответствующие планы выполнения следующие.

Перед добавлением индекса все данные будут дважды просканированы в main таблице.

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)
0 голосов
/ 14 июля 2020

попробуйте это

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 ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...