Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Доброго времени суток,
столкнулся с такой вроде небольшой проблемой, но сижу над ней уже двое суток и ничего толкового не нарыл, поэтому приходится обращаться на форумы
значит, собственно, запрос:
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 записи из базы. одна из них связана с данными из второй таблицы (обязанность А и коммент "ВАЖНО!").
проблема в том, что обязанноьсти могут быть не привязаны к данному клиенту, либо одна и та же обязанность может быть привязана к нескольким клиентам. отсюда путаница. либо показываются несколько копий одной и той же обязанности в одном параграфе, либо показываются только те, у которых есть привязанные к клиенту данные.
для большей наглядности - что выдает запрос:
т.е. нужны только те поля, где kunde = 11353 или NULL.
вот так, коротко и ясно в одном предложении, все предыдущее можно было опустить, но надеюсь понятно разъяснил
как реализовать? методом тыка никак не получается, любой помощи заранее благодарен.
Неактивен
Здравствуйте.
Ну а если сгруппировать по kunde?
Неактивен
Ну а если сгруппировать по kunde?
если поставить в конце запроса GROUP BY kunde, то выдаст по одной записи для разных айди кдиента (одну где kunde=11353, одну kunde=11962 и kunde=NULL). а надо чтобы было все 11353 и NULL.
Неактивен
То есть группировка нужна по обязанности, то есть по flicht_id?
Неактивен
получается.
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
так, на полпути у цели теперь возвращает впринципе то что нужно , но пока еще нет привязок к какому нибудь определенному клиенту, т.е. будет по одной первой попавшейся записи с таким pflicht_id брать, остальные убирать, что спорвоцирует показ записей всех клиентов вперемешку.. если в where дописать kunde=11353, обрезаются записи, где kunde=null, а они тоже нужны. варианты kunde=NULL, kunde="NULL", !kunde, kunde=0 не работают. как тут поступать?
Неактивен
В случае с группировкой, если не устраивает случайность в выборе сопутствующего столбца из другой таблицы, нужно указать этот критерий самому.
В Вашем случае проблема в том, что стоит указать mysql'ю - как ему выбирать между двумя kunde - 11393 и 11652. Какой именно выбирать - тут Вам виднее. Можно выбрать максимальный, можно минимальный - в-общем как-то указать. И это, между прочим, касается не только kunde, а всех полей, которые будут выбираться. Почитайте немного про группировки в запросах, станет яснее.
Указывайте не kunde="NULL", а kunde is null.
Неактивен
>> Указывайте не kunde="NULL", а kunde is null.
отлично, то что и искал, это решило всю мою проблему
Спасибо большое и доброй ночи
Неактивен
Пожалуйста, обращайтесь . А итоговую версию запроса покажете?, интересно же, за что боролись-то .
Отредактированно deadka (08.12.2011 03:03:59)
Неактивен
все банально (проблема заключалась в принчипе в неумении обращаться с полями со значениями NULL ):
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)
Неактивен
Страниц: 1