2015-03-15 2 views
2

Почему этот запрос returing все строки с / при использовании равной в присоединитьсяMySQL возвращает все строки с присоединиться слеш в значении

MySQL 5.6 Схема установки:

CREATE TABLE entity 
(
id int(10) unsigned not null AUTO_INCREMENT, 
parent_id int(10) unsigned, 
title varchar(200), 
path varchar(200), 
primary key(id), 
CONSTRAINT `SelfKey` FOREIGN KEY (`parent_id`) REFERENCES `entity` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
); 
INSERT INTO entity (id, parent_id, title,path) 
VALUES (1, null, 'parent title','1'),(2, 1, 'child 1','1/2'), 
(3, 1, 'child 2','1/3') 

Query 1 :

select c.title,c.path from entity e inner join entity c on c.path = e.id 

Результаты:

| title  | path | 
|----------------|------| 
| parent title | 1 | 
| child 1  | 1/2 | 
| child 2  | 1/3 | 

Я имею в виду использование

select c.title,c.path from entity e inner join entity c on c.path = e.id 

вместо

select c.title,c.path from entity e inner join entity c on c.path like concat(e.id,'/%') 

первый дает гораздо лучше Performence, а также возвращает родительскую строку вместе с детьми, то второй один

+0

Что вы хотите, чтобы вернуться? –

+0

Я знаю, что могу получить детей, запросив 'на c.path, например concat (e.id, '/%')', просто хотел узнать здесь, почему он сохраняет все строки, пока он должен возвращать только родительский ie. 'path = 1', это ускользает от проблемы – reverbnation

ответ

1

Путь определяется как varchar, а id - целое число. MySQL будет неявным образом использовать varchar для целого числа без знака. Когда он преобразует 1/3 в целое число, он будет начинаться слева и читать символы, пока не найдет тот, который не является цифрой (в данном случае /), и все до этого будет преобразовано в int. Таким образом, 1/3 превращается в 1:

select cast('1/3' as unsigned) 

+ ---------------------------- + 
| cast('1/3' as unsigned)  | 
+ ---------------------------- + 
| 1       | 
+ ---------------------------- + 

См MySQL Type Conversion

Смежные вопросы