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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Второй селект создаёт дубли, а не массив

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: На выходе первый селект многократно дублируется с добавлением строк второго селекта
isle
Отправлено: 18 Февраля, 2014 - 21:52:42
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Привет, форумчане.

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


В одной таблице - список заведений, в другой - тип заведений (ресторан, бар, ...)

(Отредактировано автором: 18 Февраля, 2014 - 21:54:12)

 
 Top
Мелкий Супермодератор
Отправлено: 18 Февраля, 2014 - 22:26:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




isle пишет:
Должно выглядеть:

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


-----
PostgreSQL DBA
 
 Top
isle
Отправлено: 18 Февраля, 2014 - 22:37:12
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Мелкий пишет:
isle пишет:
Должно выглядеть:

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


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

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

Эх... Большое спасибо за отклик.
 
 Top
Мелкий Супермодератор
Отправлено: 19 Февраля, 2014 - 08:40:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Нафига 151 запрос?
0) выбрали список заведений
1) по полученным id заведений выбрали их типы заведений, запихали в двумерный массив [id_заведения][] = тип
Аналогично с остальными связями 1:М.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB