Mysql сделать выборку из таблиц

Artem_Paris

Новичок
Есть таблица машин и таблица с комплектациями к ним. Нужно выбрать ту машину, у которой в комплектации есть описание дисков, но нет турбины.

Помогите разобраться плиз.
 

Вложения

  • 681 байт Просмотры: 7

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
С чем помочь? Сам как пытался делать?
 

Artem_Paris

Новичок
Думаю надо с join'ами пытаться. Не близко знаком с ними, пробовал так
Код:
select c.name, k.type, k.value
  from cars c
left join  kit k on (k.type = 'disk' and k.value is not null)  and
(k.type = 'turbo' and k.value is  null)
  where c.id = k.car_id
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Имхо так:
Добавить индекс на car_id и попробовать

Код:
EXPLAIN SELECT GROUP_CONCAT(type) as x, car_id
FROM kit k1
GROUP BY car_id
HAVING FIND_IN_SET('disk', x) != 0 AND FIND_IN_SET('turbo', x) = 0;
Если что не так, поправьте. Решение кривое вышло
 

Artem_Paris

Новичок
Может я что не так понял, но все равно результата нет. Для наглядности я добавил в базу еще несколько записей.
Код:
INSERT INTO `cars` (`id`, `name`) VALUES
(3, 'MERS'),
(4, 'SAAB');

INSERT INTO `kit` (`type`, `value`, `car_id`) VALUES
('disk', '15', 3),
('turbo', 'TD-04', 3),
('turbo', 'TD-05', 4);
Выборка должна вывести название машин, у которых в комплектации указаны диски, но нет турбины.
То есть нужно выбрать все машины из cars, и по айдишнику смотреть, чтобы в таблице kit была запись где cars.id = kit.car_id и type='disk', а запись где type='turbo' отсутствует или если type=turbo есть, то value должен быть null
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ты с моим примером что сделал? Ты туда хоть первую таблицу cars приджоинил?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Artem_Paris, а вот это ты должен сделать сам, просто сделай JOIN cars к таблице k1 по нужным полям =)
 

Artem_Paris

Новичок
Красавец! ты крут! Только если бы я мог сделать сам, наверно не пришел бы сюда за помощью.

Если имеется ввиду это:
Код:
SELECT car_id, c.name, GROUP_CONCAT(type) as x, k1.value
FROM kit k1
join cars c on k1.car_id = c.id
GROUP BY car_id
HAVING FIND_IN_SET('disk', x) != 0 AND FIND_IN_SET('turbo', x) = 0
то выборка неверная.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Неверная, ок. Исходя из твоего условия там должна быть машина номер 1, с использованием изначальных данных. У нее есть описание дисков и нет турбины. Так? Где именно неправильная выборка?
 

Artem_Paris

Новичок
Прошу прощения. все норм сработало. Спасибо!
Только я сделал немного иначе, без join
Код:
select  car_id, c.name,  GROUP_CONCAT(type) as x, k1.value
from kit k1, cars c
where k1.car_id = c.id
GROUP BY car_id
HAVING FIND_IN_SET('disk', x) != 0 AND FIND_IN_SET('turbo', x) = 0
Про FIND_IN_SET и GROUP_CONCAT никогда не слышал)
 
Сверху