Таблица b хранит добавочные коды к деталям: id2 - идентификатор соответствующий значению поля id таблицы a, kod2 - хранит дополнительные коды.
Пытаюсь решить поиск одним SQL запросом.
Таблица a
id kod name
1 001 Деталь1
2 002 Деталь2
3 003 Деталь3
4 004 Деталь4
Таблица b
id2 kod2
2 101
2 102
4 103
1 104
SELECT a.id, a.kod, a.name FROM a WHERE kod LIKE '%04%'
Результат:
4 004 Деталь4
SELECT a.id, a.kod, a.name, b.kod2 FROM a LEFT JOIN b ON b.id2 = a.id WHERE b.kod2 LIKE '%04%'
Результат:
1 001 Деталь1 104
А мне нужно написать такой запрос чтобы был такой результат:
4 004 Деталь4 ПУСТО(просто пустое значение)
1 001 Деталь1 104
Надеюсь на помощь. Спасибо.
Спустя 2 часа, 16 минут, 55 секунд (9.10.2010 - 12:14) SlavaFr написал(а):
SELECT a.id, a.kod, a.name, b.kod2 FROM a LEFT JOIN b ON b.id2 = a.id and b.kod2 LIKE '%04%'
отредактировал
Спустя 47 минут, 58 секунд (9.10.2010 - 13:02) greatilya написал(а):
SlavaFr
спасибо за помощь, только, к сожалению ваши запросы не решали мою проблему. Перепробовал множество вариантов. И на удивление сработал этот вариант:
Выдает именно тот результат который нужно.
Получается мне нужно было искать код сначала в первой таблице, затем во второй. После, объединить результаты.
(добавлено позже)
Я бы даже сказал так:
спасибо за помощь, только, к сожалению ваши запросы не решали мою проблему. Перепробовал множество вариантов. И на удивление сработал этот вариант:
SELECT `a`.`id`, `a`.`kod`, `a`.`name`, `b`.`kod2` FROM `a` LEFT JOIN `b` ON `a`.`id` = `b`.`id2` WHERE `a`.`kod` LIKE '%04%' OR `b`.`kod2` LIKE '%04%'
Выдает именно тот результат который нужно.
Получается мне нужно было искать код сначала в первой таблице, затем во второй. После, объединить результаты.
(добавлено позже)
Я бы даже сказал так:
SELECT `a`.`id`, `a`.`kod`, `a`.`name`, `b`.`kod2` FROM `a` LEFT JOIN `b` ON `a`.`id` = `b`.`id2` WHERE `a`.`kod` LIKE '%04%' OR `b`.`kod2` LIKE '%04%' GROUP BY `a`.`id`
Спустя 48 минут, 7 секунд (9.10.2010 - 13:50) Michael написал(а):
Цитата (greatilya) |
И на удивление сработал этот вариант: |
ищешь соответствие в двух разных столбцах и OR удивляет ?
Спустя 1 час, 15 минут, 27 секунд (9.10.2010 - 15:06) greatilya написал(а):
Цитата |
ищешь соответствие в двух разных столбцах и OR удивляет ? |
я думал
LEFT JOIN `b` ON `a`.`id` = `b`.`id2`не пропустит в том случае когда
`a`.`kod` LIKE '%04%'если в таблице b нет такой записи.
Просто пока не всё понимаю в SQL, тонкостей работы с Join
Спустя 24 минуты, 18 секунд (9.10.2010 - 15:30) arvitaly написал(а):
Что то я не пойму у вас во второй таблице id2 тоже уникальный получается? Зачем она вообще тогда нужна
Спустя 23 минуты, 40 секунд (9.10.2010 - 15:54) greatilya написал(а):
arvitaly
во второй таблице id2 это идет как бы ссылка на a.id ... так что он не уникальный
во второй таблице id2 это идет как бы ссылка на a.id ... так что он не уникальный
Спустя 15 минут, 15 секунд (9.10.2010 - 16:09) arvitaly написал(а):
Цитата |
во второй таблице id2 это идет как бы ссылка на a.id ... так что он не уникальный |
Но тогда
table1
id kod name
1 005 aaaaa
2 004 bbbbb
3 007 cccccc
4 009 ddddd
table2
id2 kod2
3 104
3 204
Ваш запрос найдет только одну запись из второй таблицы
Спустя 14 часов, 46 минут, 13 секунд (10.10.2010 - 06:55) greatilya написал(а):
Цитата |
Ваш запрос найдет только одну запись из второй таблицы |
Ну да, результат такой:
2 004 bbb NULL
3 007 ccc 104
Так и нужно ведь мне то по сути нужно найти детали из первой таблицы, поэтому я и применил GROUP BY. Конкретная деталь представлена в первой таблице, и будет не совсем правильно дважды выводить одну деталь. Во второй таблице добавочные коды к детали. Просто у одной детали есть несколько производителей и у каждого свой код. По уму бы конечно в последний столбик бы вывести не "104", а "104, 204". Но как я понимаю это уже не на SQL решается задача, а в РНР нужно будет делать добавочно к каждому запрос. Ну это уже после решу вопрос. Даже если придется делать потом для каждой выводимой детали запрос во вторую таблицу, то это уже будет не так принципиально, т.к. вторая таблица содержать будет порядка 50 000 записей, что по сравнению с первой таблицей (1 000 000 записей) значительно меньше.
Спустя 1 час, 17 минут, 55 секунд (10.10.2010 - 08:13) Michael написал(а):
Цитата (greatilya @ 10.10.2010 - 05:55) | ||
Ну да, результат такой: 2 004 bbb NULL 3 007 ccc 104 |
Правильно было бы сказать:
Ну нет, результат такой: ...
т.к. вернет две записи.
И что означает из первой, второй таблицы? Так я понимаю можно сказать еще про UNION объединение строк, но тут то во FROM все таблицы по неким правилам(например left join) соединяются в одну.
p.s. с запросом все ок.
Спустя 13 часов, 16 минут, 12 секунд (10.10.2010 - 21:29) arvitaly написал(а):
Цитата |
Но как я понимаю это уже не на SQL решается задача, а в РНР нужно будет делать добавочно к каждому запрос. |
Да нет, решается на mysql. Только я не понял нужно вам это или нет