Поиск несвязанных записей

spions
Дата: 07.02.2013 23:47:33
Коллеги,
Есть таблица содержащие все возможные ID
Есть справочник, содержащий некоторые имена.
Есть таблица связей

Вопрос, как мне выделить записи, у которых нет данных одного типа ( у второй записи не хватает имени
первого типа "имя_rus", у четвертой имени второго типа "имя_eng").
И записи, у которым вообще не присвоены имена (например запись с ID=3)

Таблица ID
1
2
3
4

Таблица имен (id_name, name, tip)
1 имя_rus1 1
2 имя_eng2 2
3 имя_eng3 2
4 имя_rus4 1

Таблица связей(ID,id_name)
1 1
1 2
2 3
4 4
javajdbc
Дата: 08.02.2013 05:22:35
spions,

поэкспериментируйте с лефт жоинтом:

select *
from Таблица_ID t1
left join Таблица_связей t2 on t1.id = t2.id and t2.id_name = 2
where t2.is is null

это: найти все ИД у которых нет имя_eng2
spions
Дата: 08.02.2013 08:32:27
Пробовал. В похожем запросе всплывает запись с ID=1, где у первого типа name будут null хотя фактически это не так.
Если сделать условие tip=1 or tip=2 тогда происходит потеря записей у которых лишь один тип.
Akina
Дата: 08.02.2013 09:09:20
select ID
from `таблица связей`
where id_name in (1, 2)
group by ID
having count(distinct id_name) < 2
bochkov
Дата: 08.02.2013 09:30:01
если возможные типы= [1,2]
тогда
SELECT DISTINCT t.id
FROM table_id t
LEFT JOIN table_link  l1 ON t.id=l1.id
LEFT JOIN table_name n1 ON l1.id_name=n1.id_name AND n.tip=1 # наличие тип 1
LEFT JOIN table_link  l2 ON t.id=l2.id
LEFT JOIN table_name n2 ON l2.id_name=n2.id_name AND n.tip=2 # наличие тип 2
WHERE n1.id_name IS NULL OR n2.id_name IS NULL

из-за OR индексы, если они есть, работать не будут
можно разбить OR и заменить на UNION
spions
Дата: 08.02.2013 11:54:53
Akina,
пробовал раньше не то, как как не понятно записей какого типа не хватает.
spions
Дата: 08.02.2013 11:56:24
bochkov,
тоже не заработало.
Делаю так

SELECT *
FROM tvh4_Film_dop film_dop
LEFT JOIN tvh4_Film film1 on film_dop.film_id=film1.Film_ID AND film1.`Type_record_ID` =1
LEFT JOIN tvh4_Name name1 ON film1.`Object_ID`=name1.id and name1.Language_ID=1

LEFT JOIN tvh4_Film film2 on film_dop.film_id=film2.Film_ID AND film2.`Type_record_ID` =1
LEFT JOIN tvh4_Name name2 ON film2.`Object_ID`=name2.id and name2.Language_ID=2

В результате получаю 4 записи из них 2 нулевые, а две одинаковые с name2.Language_ID=2 , хотя явно должно быть 2 не пустых записи.
spions
Дата: 08.02.2013 13:43:05
Я нашел решение, но оно не совсем красивое и определенно долгое (10-15 секунд) даже для 11т. записей
Сначала я сделал select и подготовил предварительную таблицу содержащую связку ID-Name
А потом, делаю join с условием к этой таблице, естественно где нет записи нужного типа проявляются NULL записи.

Так как запрос данного типа нечастый, думаю оставить, хотя решение не совсем элегантное.
Приму советы по ускорению запроса :)

SELECT *

FROM tvh4_Film_dop film_dop
LEFT JOIN (
SELECT film.Film_ID Film_ID, name.Language_ID Language_ID, name.Name_Text Name_Text
FROM tvh4_Film film
LEFT JOIN
tvh4_Name name ON film.`Type_record_ID` =1
AND film.`Object_ID` = name.id
WHERE film.`Type_record_ID` =1
) sol

ON film_dop.film_id = sol.Film_ID
AND sol.`Language_ID` =1
where sol.`Language_ID` is null
Akina
Дата: 08.02.2013 14:22:12
spions
не понятно записей какого типа не хватает.
Перечитай исходный пост и найди хоть полслова об этом - что тебе нужно вывести не список с нехватками, а чего именно нехватает...
Но я не понимаю, чего тебе нужно - у тебя есть проблемные ID, трудно по второй копии таблицы получить для них то, что у них уже есть?
spions
Дата: 08.02.2013 14:57:23
Akina,

Есть фильм, у него есть русское и английское название или несколько русских и английских.
У некоторых фильмов есть только русское, у некоторых только английское, у некоторых нет ничего :)
Задача отловить фильмы без русского названия, без английского, без названий вообще.

Это частный случай, но идея в общем-то такая.

При помощи данного треда решение додумал и написал выше.
Но возможно есть более элегантный способ.