2014-09-13 2 views
0

У меня есть две таблицы, одна из которых содержит путь, а другая - имя файла. Вот пример:SQL-имя в списке элементов

t1 
- file.mov 
- myfile.txt 
- 2file.py 

t2 
- /new/path/file.mov 
- /path/hello.txt 
- /path/2file.py 

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

- file.mov /new/path/file.mov 
- 2file.py  /path/2file.py 

Что бы запрос я мог бы использовать, чтобы найти это? Ближайший я мог думать использует IN, но основан на точном матче и не LIKE, который является то, что мне нужно использовать:

SELECT name FROM names WHERE name in (SELECT path FROM paths); 

ответ

0

с помощью INNER JOIN между к 2 таблицы позволит вам перечислить один или оба имена файлов и пути

SELECT names.name, paths.path 
FROM names 
INNER JOIN paths ON names.name = SUBSTRING_INDEX(paths.path, '/', -1) 
; 

Однако выход будет (из образца):

|  NAME |    PATH | 
|----------|--------------------| 
| file.mov | /new/path/file.mov | 
| 2file.py |  /path/2file.py | 

потому что у вас нет пути к «myfile.txt» или имени для «/path/hello.txt» (так что этот результат не соответствует результату, показанному в вопросе).

0
SELECT name 
FROM names 
WHERE name in 
    (SELECT SUBSTRING_INDEX(path, '/', -1) FROM paths); 
0

Вы упомянули, используя LIKE - объединение, что с EXISTS может работать. Например.

SELECT name 
FROM names 
WHERE EXISTS (
    SELECT * 
    FROM paths 
    WHERE path LIKE '%' + name 
) 

Просто имейте в виду, что это имеет потенциал для возвращения ложных срабатываний, то есть если таблица пути содержала «путь/2file.py», и вы искали «file.py».