forum.bitel.ru
http://forum.bitel.ru/

Через SQL получить список субдоговоров для супердоговора
http://forum.bitel.ru/viewtopic.php?f=19&t=7347
Страница 1 из 1

Автор:  Phricker [ 26 окт 2012, 14:41 ]
Заголовок сообщения:  Через SQL получить список субдоговоров для супердоговора

И снова обращаюсь за помощью к знатокам.
Необходимо через SQL запрос получить список всех супердоговоров или же договоров не привязанных ни к кому (юридические лица), и во втором поле получить через запятую список ВСЕХ субдоговоров этого договора (зависимых и независимых)
Ситуация осложняется тем, что поле sub_list используется только для зависимых субдоговоров. Все независимые субдоговора прописывают у себя в поле scid - ID супердоговора.
Чем руководствовалась такая логика непонятно :D
Должно выглядеть как-то так
Код:
ID супердоговора, Title, sub_list

и в sub_list через запятую все субдоговора.
Если субдоговоров нет - то поле sub_list пустое

Автор:  Phricker [ 26 окт 2012, 14:48 ]
Заголовок сообщения:  Re: Через SQL получить список субдоговоров для супердоговора

Необходимо нечто вроде
Код:
getSubContracts(int cid)
Получает все субдоговоры данного договора.

из ContractManager

Автор:  Phricker [ 26 окт 2012, 15:18 ]
Заголовок сообщения:  Re: Через SQL получить список субдоговоров для супердоговора

Можно вот так
Код:
SELECT c.id, c.title, c.comment, CONCAT_WS(",",(SELECT sub_list FROM contract WHERE id = c.id), (SELECT GROUP_CONCAT(id) FROM contract WHERE scid = c.id))
FROM contract AS c
WHERE c.fc = 1
AND c.scid <= 0

Но тогда подставляется лишняя запятая впереди. Мешает :(
Вот например для трех договоров у первого из которых все субдоговора зависимые, у второго есть независимый субдоговор, а третий свободен
Код:
mysql> SELECT c.id, c.title, c.comment, CONCAT_WS(",",(SELECT sub_list FROM contract WHERE id = c.id), (SELECT GROUP_CONCAT(id) FROM contract WHERE scid = c.id))
    -> FROM contract AS c
    -> WHERE c.fc = 1
    -> AND c.scid <= 0
    -> AND c.title IN ('IPN000003', 'DP010746', 'PH000909');
+-------+-----------+----------------------------------+---------------------------------------------------------------------------------------------------------------------------+
| id    | title     | comment                          | CONCAT_WS(",",(SELECT sub_list FROM contract WHERE id = c.id), (SELECT GROUP_CONCAT(id) FROM contract WHERE scid = c.id)) |
+-------+-----------+----------------------------------+---------------------------------------------------------------------------------------------------------------------------+
|  8853 | DP010746  | ▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒ "▒▒▒▒▒▒▒ ▒▒▒▒▒" | 9023,9024,9025,12043,12131,12133,12134,15888,15897,18508,9023,9024,9025,12043,12131,12133,12134,15888,15897,18508         |
|  2325 | IPN000003 | ▒▒▒ "▒▒▒▒▒"                      | ,3848                                                                                                                     |
| 94840 | PH000909  | ▒▒▒   "▒▒▒▒▒"                    |                                                                                                                           |
+-------+-----------+----------------------------------+---------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

Эта лишняя запятая :(

Автор:  Phricker [ 26 окт 2012, 17:54 ]
Заголовок сообщения:  Re: Через SQL получить список субдоговоров для супердоговора

Вместо CONCAT_WS использовать CONCAT - и вроде бы все получается :)
Сейчас еще тестирую

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/