SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 08.12.2011 02:21:40

muxa92
Участник
Зарегистрирован: 08.12.2011
Сообщений: 5

Как правильно составить запрос на две таблицы - вопрос!

Доброго времени суток,

столкнулся с такой вроде небольшой проблемой, но сижу над ней уже двое суток и ничего толкового не нарыл, поэтому приходится обращаться на форумы smile

значит, собственно, запрос:
SELECT pflicht_id, pflicht, pflicht_monitoring, kunde, prioritaet, pflicht_standard, pruefzycklus, kunde FROM rk_pflichten LEFT JOIN rk_kunden_pflichten_data USING(pflicht_id) WHERE pflicht_paragraph_id=17885

краткое поясление:
- pflicht_id - идентификатор определенной обязанности параграфа
- kunde - ид клиента, к которому привязаны какие то специфические данные обязанности параграфа.
- rk_pflichten - таблица со списком обязанностей
- rk_kunden_pflichten_data - таблица со списком специфических для клиентов данных.

суть: есть документы. к ним есть параграфы. у параграфов есть какие то обязанности, которых клиенты должны выполнять. Обязанности они есть всегда, т.е. её нельзя к кому то особо привязать. но есть некоторые данные, которые привязаны только к особым клиентам (ответственный за эту обязанность, комментарий, статус итд).

должны отображаться все обязанности, которые внесены в параграф. т.е. например параграф 1, обязанность А и обязанность Б. Если клиенту 123 также привязаны какие то данные (написер, комент "ВАЖНО!" к обязанности А), также должен показываться и он. Т.е. итого должны показываться 2 записи из базы. одна из них связана с данными из второй таблицы (обязанность А и коммент "ВАЖНО!").

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

для большей наглядности - что выдает запрос:
http://s017.radikal.ru/i415/1112/6d/cfa4078102fe.png

т.е. нужны только те поля, где kunde = 11353 или NULL.
вот так, коротко и ясно в одном предложении, все предыдущее можно было опустить, но надеюсь понятно разъяснил smile

как реализовать? методом тыка никак не получается, любой помощи заранее благодарен. smile

Неактивен

 

#2 08.12.2011 02:25:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как правильно составить запрос на две таблицы - вопрос!

Здравствуйте.

Ну а если сгруппировать по kunde?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 08.12.2011 02:38:44

muxa92
Участник
Зарегистрирован: 08.12.2011
Сообщений: 5

Re: Как правильно составить запрос на две таблицы - вопрос!

Ну а если сгруппировать по kunde?

если поставить в конце запроса  GROUP BY kunde, то выдаст по одной записи для разных айди кдиента (одну где kunde=11353, одну kunde=11962 и kunde=NULL). а надо чтобы было все 11353 и NULL.

Неактивен

 

#4 08.12.2011 02:43:17

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как правильно составить запрос на две таблицы - вопрос!

То есть группировка нужна по обязанности, то есть по flicht_id?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 08.12.2011 02:50:56

muxa92
Участник
Зарегистрирован: 08.12.2011
Сообщений: 5

Re: Как правильно составить запрос на две таблицы - вопрос!

получается.

SELECT pflicht_id, pflicht, pflicht_monitoring, kunde, prioritaet, pflicht_standard, pruefzycklus, kunde FROM rk_pflichten LEFT JOIN rk_kunden_pflichten_data USING(pflicht_id) WHERE pflicht_paragraph_id=17885 GROUP BY pflicht_id

так, на полпути у цели smile теперь возвращает впринципе то что нужно , но пока еще нет привязок к какому нибудь определенному клиенту, т.е. будет по одной первой попавшейся записи с таким pflicht_id брать, остальные убирать, что спорвоцирует показ записей всех клиентов вперемешку.. если в where дописать kunde=11353, обрезаются записи, где kunde=null, а они тоже нужны. варианты kunde=NULL, kunde="NULL", !kunde, kunde=0 не работают. как тут поступать?

Неактивен

 

#6 08.12.2011 02:56:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как правильно составить запрос на две таблицы - вопрос!

В случае с группировкой, если не устраивает случайность в выборе сопутствующего столбца из другой таблицы, нужно указать этот  критерий самому.

В Вашем случае проблема в том, что стоит указать mysql'ю - как ему выбирать между двумя kunde - 11393 и 11652. Какой именно выбирать - тут Вам виднее. Можно выбрать максимальный, можно минимальный - в-общем как-то указать. И это, между прочим, касается не только kunde, а всех полей, которые будут выбираться. Почитайте немного про группировки в запросах, станет яснее.

Указывайте не kunde="NULL", а kunde is null.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 08.12.2011 03:01:54

muxa92
Участник
Зарегистрирован: 08.12.2011
Сообщений: 5

Re: Как правильно составить запрос на две таблицы - вопрос!

>> Указывайте не kunde="NULL", а kunde is null.

отлично, то что и искал, это решило всю мою проблему smile
Спасибо большое и доброй ночи wink

Неактивен

 

#8 08.12.2011 03:03:05

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как правильно составить запрос на две таблицы - вопрос!

Пожалуйста, обращайтесь smile. А итоговую версию запроса покажете?, интересно же, за что боролись-то big_smile.

Отредактированно deadka (08.12.2011 03:03:59)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 08.12.2011 03:08:20

muxa92
Участник
Зарегистрирован: 08.12.2011
Сообщений: 5

Re: Как правильно составить запрос на две таблицы - вопрос!

все банально (проблема заключалась в принчипе в неумении обращаться с полями со значениями NULL big_smile):

SELECT pflicht_id, pflicht, pflicht_monitoring, kunde, prioritaet, pflicht_standard, pruefzycklus FROM rk_pflichten LEFT JOIN rk_kunden_pflichten_data USING(pflicht_id) WHERE pflicht_paragraph_id=".$this->paragraph_id." AND (kunde=".$this->kunde_id." or kunde is null)

UPD: все таки это все еще неправильно. если выбирается kunde=11962, то должны показываться все те же три обязанности, но из-за того что у одной из них есть связка с клиентскими данными, то она уже не считается обязанностью, относящуюся к 11962 клиенту. а должна. (pflicht_id=3492 в данном случае не показывается).

но тут наверно проще уже в скрипте сделать, или как то через запрос можно?

Отредактированно muxa92 (08.12.2011 03:16:41)

Неактивен

 

Board footer

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