[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка и формирование массива
Страницы: 1, 2, 3
I++
Как мне кажется, если простыми запросами оперировать без INNER JOIN и тд. то такой код проще:

// с массивом
$products_by_day = array();
foreach($menu as $menu_val)
{
$products_by_day[$menu_val['wday']][] = $this->_getProductById($menu_val['ID']);
}


Хотя там по сути нужно было бы сделать INNER JOIN с menu.menu_id = product.menu_id

Тогда вывелись бы все продукты которые входят в это меню, плюс можно было сделать выборку и еще по другой таблице где указаны дни недели и там уже сверять product.menu_id = date.id и в вывод добавить wday

Тогда бы на выходе получили такой список:

продукт, день недели.

и там уже можно было в цикле пройти и собрать конечный массив для вывода.

Просто если массив вот такой:

продукт -> день недели , не получится отсортировать его. Нужно сначала формировать по дням недели продукты, а потом уже перебирать, так проще оперировать.

В mysql так же можно делать выборку по диапозону даты, типо this week
sendxt
I++
ну да всё отсортировалось кроме самого продукта)) и сейчас с ним косяк, так как его id везде подставляется)
function _getAllProductsById($id, $menu_id) {[php]

[
sql]

$q = "SELECT ID, LABEL, AVATAR_SMALL, CAT_ID
(SELECT WDAY FROM ED_MOD_KITCHEN_DAY_MENU d WHERE d.MENU_ID = :menu_id) as WDAY // на это дело ругается syntax error сам запрос в phpmyadmin осуществляется
FROM ED_MOD_KITCHEN_PRODUCT k
WHERE CAT_ID = :cat_id "
;//
[/sql]
//пробовал делать inner join ED_MOD_KITCHEN_DAY_MENU on dm dm.menu_id = :menu_id // ambigous error
[php]
while ($row = $this->_db->GetRowAsArray($r)) {
$returnArray[$row['WDAY']] = $row;
}
[php]
Что если получить wday , и для продуктов таким образом его подставить?
I++
нужно залезть в phpmyadmin и курить INNER JOIN и свои таблицы.

либо не использовать INNER JOIN и везде обычными SELECT * FROM example WHERE чегототам =

И потом в php самому это все собирать в зависимости от id продукта или чего нам нужно, но это хрень, зато работает, дешево и сердито. Но INNER JOIN для лучше ибо выдаст сразу сопоставленные данные.

Цитата
ну да всё отсортировалось кроме самого продукта)) и сейчас с ним косяк, так как его id везде подставляется)


Просто в данном случае, день недели должен быть вот псевдокод массива:

array(0 => array('product 1', 'product 2'), 1 => array('product 3', 'product 4'))

числовые ключи массива это дни недели.

А если нужно по дням неделям и категориям разнести то вот такой массив:

array(
0 =>
array(
0 => array('product 1'),
5 => , array('product 2')
)
)



и получается у нас идет день недели -> категория -> продукт.
sendxt
то что выше пост над вашим, я в ту сторону пытаюсь копать? правильно понимаю? ) вроде бы вы мне что-то похожее пытается растолковать )
I++
order by wday

но там опять таки все выведется не совсем так как ожидалось)
потому что цикл с переменной d и количество записей с таким d разное
I++
Как то так:

SELECT t.ID, t.LABEL, t.AVATAR_SMALL, t.CAT_ID, p.wday FROM ED_MOD_KITCHEN_PRODUCT t LEFT JOIN ED_MOD_KITCHEN_DAY_MENU p USING(ID) AND p.MENU_ID = :menu_id ORDER BY t.wday ASC
sendxt
I++
запутался)) домой приеду буду медитировать так вашим написанным,))
вы так шустро вникли в суть дела , жесть)
массив , получил такой вроде как надо


2 =>
array (
'ID' => '56',
'LABEL' => 'Сок',
'AVATAR_SMALL' => '',
'CAT_ID' => '7',
'WDAY' => '2',
),


такого типа
I++
О значит запрос сработал wday сходится с ID? если да то отлично, теперь остается сделать следующие:



// этот массив из запроса получаем
$test = array(0 => array (
'ID' => '56',
'LABEL' => 'Сок',
'AVATAR_SMALL' => '',
'CAT_ID' => '7',
'WDAY' => '2',
));


$product_by_day = array();

foreach($test as $product)
{
$product_by_day[$product['WDAY']][] = $product;
}


В переменной $product_by_day будет массив с ключами по дням.
А дальше остается только вывести его в зависимости от дня недели.
sendxt
I++
Всё бы ничего но

$arrayOfProducts = $this->_getAllProductsById($arrayOfCategories[$i]['ID'], $menu_id); //тут такая бяка получается
array (
2 =>
array (
'ID' => '56',
'LABEL' => 'Sultys',
'AVATAR_SMALL' => '',
'CAT_ID' => '7',
'WDAY' => '2',
),

4 =>
array (
'ID' => '56',
'LABEL' => 'Sultys',
'AVATAR_SMALL' => '',
'CAT_ID' => '7',
'WDAY' => '4',
),

8 =>
array (
'ID' => '56',
'LABEL' => 'Sultys',
'AVATAR_SMALL' => '',
'CAT_ID' => '7',
'WDAY' => '8',
),

16 =>
array (
'ID' => '56',
'LABEL' => 'Sultys',
'AVATAR_SMALL' => '',
'CAT_ID' => '7',
'WDAY' => '16',
),
);



вылазит это тут

for ($j = 0; $j < count($arrayOfProducts); $j++) {
// count = 4 по 4 продукта выводит )

запрос был такой:

$q = "SELECT k.ID, k.LABEL, k.AVATAR_SMALL, k.CAT_ID, dm.WDAY
FROM ED_MOD_KITCHEN_PRODUCT k
INNER JOIN ED_MOD_KITCHEN_DAY_MENU dm ON dm.MENU_ID = :menu_id
WHERE k.CAT_ID = :cat_id
ORDER BY WDAY"


что-то в этой строке USING(ID) AND p.MENU_ID = :menu_id
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.