Задать вопрос
@Teraxis

Какой вариант запроса более продуктивный?

Имеются две таблицы clients_case и clients следующей структуры

Clients
clients_case
+----+-------------------------------------+------------+
| id | cctitle                             |  ccclients |
+----+-------------------------------------+------------+
|  1 | Подготовка бизнес-плана             | 2, 3, 7    |
|  2 | Перевод документов                  | 4,5        |
+----+-------------------------------------+------------+

clients
+----+-------------------------------+
| id | clname                        |
+----+-------------------------------+
|  1 | Клиент 1                      |
|  2 | Клиент 2                      |
|  3 | Клиент 3                      |
|  4 | Клиент 4                      |
|  5 | Клиент 5                      |
|  6 | Клиент 6                      |
|  7 | Клиент 7                      |
+----+-------------------------------+


На сайте происходит вывод списка case-ов (по 10 на страницу) с подсписком имен клиентов.

$sql = "SELECT cc.id, cc.cctitle, cc.ccclients, GROUP_CONCAT(CONCAT(cl.id,',', CAST(cl.clname AS CHAR)) ORDER BY cl.clname SEPARATOR ';') AS cln
				FROM clients_case AS cc
				LEFT JOIN clients AS cl ON FIND_IN_SET (cl.id, cc.ccclients) > 0
				GROUP BY cc.id";
$data = $this->db->select_limit($sql, 0, $size);


правильное ли выбрано решение, или лучше создать еще одну таблицу

case_to_case
+----+--------------+-----------+
| id | client_id    | case_id   |
+----+--------------+-----------+
|  2 | 2            | 1         |
|  3 | 3            | 1         |
|  4 | 4            | 2         |
|  5 | 5            | 2         |
|  7 | 7            | 1         |
+----+--------------+-----------+


и делать запрос следующим образом

$sql = "SELECT * FROM clients_case";
			$data = $this->db->select_limit($sql, 0, $size);
			
			$sql = "SELECT DISTINCT cc.*, cc.id AS id, cl.*
					FROM case_to_case AS cc 
					LEFT JOIN clients AS cl ON cl.id = cc.client_id
					GROUP BY cl.id";
			$data2 = $this->db->query($sql);
			
			foreach($data as $k => $v)
			{
				foreach($data2 as $k2 => $rec)
				{
					if($rec['case_id'] == $v['id'])
					{
						$data[$k]['clients'][] = $data2[$k2];
					}
				}
			}


Какой, по вашему мнению, более правильный вариант реализации?
  • Вопрос задан
  • 151 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@StrikeBack
Просто первый вариант не является не верным, с точки зрения реляционных БД. В столбце "ccclients" у Вас предполагается хранить ИД пользователей, которые относятся к данному кейсу. Это по сути является реализацией Многие ко Многим, но такой вариант является не верным. Верным является второй вариант, когда Пользователи, Кейсы, и связи между пользователями и кейсами хранятся в разных таблицах. Тогда никаких проблем с выборкой Кейсов и Пользователей не возникнет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
romy4
@romy4
Exception handler
ещё одну более правильный. find_in_set не использует ключи
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы