Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Второй селект создаёт дубли, а не массив
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Второй селект создаёт дубли, а не массив

Страниц (1): [1]
 

1. isle - 18 Февраля, 2014 - 21:52:42 - перейти к сообщению
Привет, форумчане.

Столкнулся с проблемой многократных дублей на выходе, если использую второй селект в запросе вместо того, чтобы получить массив на втором селекте. Из-за множественного поиска создаётся такое огромное количество дублей, что можно застрелиться... несколько дней пытался решить проблему разными подходами, используя вложенные селекты или варианты джоинов, но на выходе всё равно получаю чушь или дубли. Может, кто в курсе как это решается, нагуглить не вышло, на форуме похожего также не нашёл. Дело не в DISTINCT.

Как это выглядит:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [id] => 1
  6.             [name] => МиаПицца
  7.             [cuisine_id] => 42
  8.         )
  9.  
  10.     [1] => Array
  11.         (
  12.             [id] => 1
  13.             [name] => МиаПицца
  14.             [cuisine_id] => 1
  15.         )
  16.  
  17. )
  18.  


Должно выглядеть:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [id] => 1
  6.             [name] => МиаПицца
  7.             [cuisine_id] =>
  8.         (
  9.             [0] => 42
  10.             [1] => 1
  11.         )
  12. )
  13.  


Или что-то типа такого.

Запрос:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $arr = dbQuery("
  3.         SELECT DISTINCT
  4.                 t1.id,
  5.                 t1.name,
  6.                 t3.cuisine_id
  7.         FROM
  8.                 #__catering_card AS t1
  9.         INNER JOIN
  10.                 (
  11.                         SELECT
  12.                                 t2.id AS cid,
  13.                                 t2.cuisine_id,
  14.                                 t2.catering_id
  15.                         FROM
  16.                                 #__catering_cuisine AS t2
  17.                         WHERE
  18.                                 t2.catering_id = 1
  19.                 ) AS t3
  20.                 ON t3.catering_id = t1.id
  21.         WHERE
  22.                 t1.id = 1
  23. ");
  24. echo "<pre>"; print_r($arr); echo "</pre>";
  25.  


В одной таблице - список заведений, в другой - тип заведений (ресторан, бар, ...)
2. Мелкий - 18 Февраля, 2014 - 22:26:00 - перейти к сообщению
isle пишет:
Должно выглядеть:

Почему? Должно выглядеть именно так, как в первом случае.
3. isle - 18 Февраля, 2014 - 22:37:12 - перейти к сообщению
Мелкий пишет:
isle пишет:
Должно выглядеть:

Почему? Должно выглядеть именно так, как в первом случае.


Получается, что никак нельзя это обойти? Каким-то другим, может, способом... ??? Мне нужно к одной главной таблице добавить ещё 3 - способ оплаты заказов заведений, тип кухонь и тип самого заведения. При выводе в каталоге на одной странице 50 заведений я получаю порядка 2 000 - 3 000 массивов (и дальше он будет ещё расти), их не проблема отсортировать в PHP и удалить дубли, но объём получаемых данных очень большой - каждая таблица примерно по 20-30 строк содержит. 50 заведений х 3 таблицы + 1 = 151 запрос только для листинга заведений, а ведь ещё сама страница кучу запросов содержит, поэтому делать 151 запрос в БД в цикле для получения этих 3-х таблиц тоже решение корявое на мой взгляд.

Эх, придётся, видимо, сервер потом помощнее брать, думал, может, какое-то другое решение есть.

Эх... Большое спасибо за отклик.
4. Мелкий - 19 Февраля, 2014 - 08:40:39 - перейти к сообщению
Нафига 151 запрос?
0) выбрали список заведений
1) по полученным id заведений выбрали их типы заведений, запихали в двумерный массив [id_заведения][] = тип
Аналогично с остальными связями 1:М.

 

Powered by ExBB FM 1.0 RC1