SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.03.2010 18:18:09

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Запрос

Думал над запросом. Чего-то ничего в голову не приходит.

Преамбула:
Есть БД. Для БД есть клиент. С этим клиентом долгое время работали,
поэтому в БД не столь мало записей.
Сейчас пишу новый клиент.
Структура БД будет меняться, но не хотелось бы усложнять себе, кхм, проблемы.

Собственно задача:
В БД есть таблица car. В ней поле CARMARK.
Старый клиент заносил в это поле название машины.
Также в БД есть таблица carmark, которая не используется в старом клиенте.

Новый клиент заносит в поле car.CARMARK ID машины в таблице carmark.
При этом, если в таблице carmark не найдено ID_CARMARK, соотв. car.CARMARK,
клиент должен выводить значение car.CARMARK.
Вопрос состоит в том как их связать.

Например, мне требуется выбрать все машины из таблицы car.

Код:

select * from car left join carmark on car.CARMARK = carmark.ID_CARMARK, car_type, purpose_type where
(car.ID_CAR_TYPE = car_type.ID_CAR_TYPE
and
car.ID_PURPOSE_TYPE = purpose_type.ID_PURPOSE_TYPE)

(Запрос не проверял).

Проблема в том, что JOIN подставит NULL, а не значение из таблицы car,
если таковое отсутствует в carmark.

Как решить эту проблему?


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#2 07.03.2010 05:13:20

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос

Ну, например, методом «автоматического пристального вглядывания» —
сначала получить список всех типов автомобилей:
SELECT DISTINCT carmark FROM car
и записать этот список в отдельную табличку, выдавая номера. После
этого у любого текстового типа автомобиля из этого списка будет
непустой JOIN wink

Неактивен

 

#3 07.03.2010 10:12:40

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Запрос

Проблема-то в том, что хочется использовать марки из таблицы carmark...
Т.е., если в carmark такого ID нет, то было подставлено в результат значение этого
ID из car.
А, если ID в car соответствует ID в carmark, было подставлено значение из carmark.

А значения, которые там понаписали в car, вообще, не использовать.
При изменении марки, заменять их на ID.

P.S.:
Кстати, марка ТС выбиралась из списка. Т.е., в принципе, названия в car
могут соответствовать названиям (не ID!) в carmark.
Ведь возможно, в таком случае, написать скрипт, который их перегонит в ID?


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#4 07.03.2010 18:46:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос

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

Такое решение неудачное, т.к. не сможет использовать индексы.
Лучше сразу перегнать всё в id. Можете вытаскивать, например,
и значение колонки в car и значение в присоединенной (LEFT JOIN)
табличке. Тогда если присоединенное значение NULL, то нужно
выводить значение из основной таблицы.

Но лучше, все же, перевести все на id.

Неактивен

 

#5 07.03.2010 19:54:51

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Запрос

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

Да. Но с некоторым уточнением.
Я хочу переделать. Но постепенно.
Новый клиент уже будет заносить идентификаторы.
Но читать должен и то, и это.

Такое решение неудачное, т.к. не сможет использовать индексы.

Не очень понимаю. Только индекс по carmark? Или, вообще, индексы в таблице?

Лучше сразу перегнать всё в id.

Дело в том, что со старым клиентом сейчас работают.
Нужно сделать и показать, что работает.
Хотя бы на чтение, для начала...
Затем, менять структуру БД.
Когда будет дописан новый клиент (если будет :-\ ) и будет переход на него.

Можете вытаскивать, например,
и значение колонки в car и значение в присоединенной (LEFT JOIN)
табличке. Тогда если присоединенное значение NULL, то нужно
выводить значение из основной таблицы.

Т.е., тот же запрос, только проверять на NULL в клиенте?

Отредактированно Артём Н. (07.03.2010 19:55:48)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#6 07.03.2010 20:34:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос

Ну, да, это самый простой способ.

Неактивен

 

#7 07.03.2010 21:14:01

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Запрос

Ясно. Наверное, так и сделаю.

Спасибо.


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson