[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите со SQL, если это возможно
greatilya
Имеются две таблицы a и b. Таблица a содердит id - autoinctiment, kod - текстовое представление кода, name - наименование детали.
Таблица 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

user posted image

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 удивляет ? blink.gif

Спустя 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 ... так что он не уникальный

Спустя 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

Правильно было бы сказать:
Ну нет, результат такой: ... smile.gif

т.к. вернет две записи.

И что означает из первой, второй таблицы? Так я понимаю можно сказать еще про UNION объединение строк, но тут то во FROM все таблицы по неким правилам(например left join) соединяются в одну.

p.s. с запросом все ок.

Спустя 13 часов, 16 минут, 12 секунд (10.10.2010 - 21:29) arvitaly написал(а):
Цитата
Но как я понимаю это уже не на SQL решается задача, а в РНР нужно будет делать добавочно к каждому запрос.


Да нет, решается на mysql. Только я не понял нужно вам это или нет
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.