[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод категорий и подкатегорий.
T0L1K.IT
Помогите пожалуйста.
Нужно вывести из бд категории и подкатегории в выпадающий список.
Делал так:
$sql = mysql_query("SELECT c.cat_id, c.name, t.tag_id, t.tag, t.cat_id, GROUP_CONCAT(DISTINCT t.tag ORDER BY t.tag_id ASC SEPARATOR ' ') AS  tag  
FROM cat c LEFT JOIN tag t ON c.cat_id=t.cat_id GROUP BY c.cat_id "
);
WHILE ($result = mysql_fetch_assoc($sql))

echo '<option>'.$result['name'].'</option><option value="'.$result['tag_id'].'">'.$result['tag'].'</option>';

В итоги выходит это:
<option>Информатика</option><br>
<option
value="2">Программирование, c++</option>
<option>
Математика</option>
<option
value="1">Университет, Школа</option>

А хотелось бы так:
<option>Информатика</option>
<option
value="2">Программирование</option>
<option
value="4">c++</option>
<option>
Математика</option>
<option
value="1">Университет</option>
<option
value="3">Школа</option>

Я так понимаю нужно копать в сторону разделителя?



Спустя 33 минуты, 40 секунд (23.10.2011 - 15:08) Лена написал(а):
Копать надо в сторону здравого смысла.
1. Вы выбираете поля t.tag и GROUP_CONCAT(DISTINCT t.tag ORDER BY t.tag_id ASC SEPARATOR ' ') AS tag - название полей неоднозначное. Поставьте алиас: t.tag tag1.
2. Зачем выбирать c.cat_id и t.cat_id - два одинаковых поля, вы по ним связываете таблицы:
c.cat_id=t.cat_id
3. В подзапросе SELECT забыли: (SELECT DISTINCT t.tag ORDER BY t.tag_id ASC SEPARATOR ' ') AS tag. Поэтому у вас сепаратор не срабатывал, по умолчанию там запятая.

Что выходит:

$sql = mysql_query("SELECT c.cat_id, c.name, t.tag_id tag1, t.tag
GROUP_CONCAT(SELECT DISTINCT t.tag ORDER BY t.tag_id ASC SEPARATOR ' ')
AS tag FROM cat c LEFT JOIN tag t ON c.cat_id=t.cat_id GROUP BY c.cat_id "
);


Но и это вам не поможет.
По-моему, вам надо как-то так:

$sql = mysql_query("SELECT c.cat_id, c.name, t.tag_id, t.tag, t.cat_id,
GROUP_CONCAT(DISTINCT t.tag ORDER BY t.tag_id ASC SEPARATOR ' ') AS tag
FROM cat c LEFT JOIN tag t ON c.cat_id=t.cat_id GROUP BY c.cat_id "
);
for ($i=0;$result = mysql_fetch_assoc($sql);$i++){
if($result['cat_id'] != $i)
{
$result['cat_id'] = $i;
echo '<option>'.$result['name'].'</option>
<option value="'
.$result['tag_id'].'">'.$result['tag'].'</option>';
}
}


Если не поможет, дайте структуру таблиц.

Спустя 30 минут, 46 секунд (23.10.2011 - 15:39) T0L1K.IT написал(а):
увы выводится тоже самое что и в первом примере. Вот структура
-
-- Структура таблицы `tag`
--

CREATE TABLE IF NOT EXISTS `tag` (
`tag_id` int(11) NOT NULL AUTO_INCREMENT,
`tag` text CHARACTER SET utf8 NOT NULL,
`cat_id` int(11) NOT NULL,
PRIMARY KEY (`tag_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;


--
-- Структура таблицы `cat`
--

CREATE TABLE IF NOT EXISTS `cat` (
`cat_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ид категории',
`name` text NOT NULL COMMENT 'название',
PRIMARY KEY (`cat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;




Спустя 56 минут, 41 секунда (23.10.2011 - 16:35) Лена написал(а):
Вам группировки здесь не нужны.

$sql = mysql_query("SELECT c.cat_id, c.name, t.tag_id, t.tag, t.cat_id
FROM cat c
LEFT JOIN tag t ON c.cat_id = t.cat_id
ORDER BY c.name, t.tag
"
);

echo '<select name="info">';

for ($i=0,$p=-1;$result = mysql_fetch_assoc($sql);$i++)
{
if($p!=$result['cat_id'])
{
$p=$result['cat_id'];
echo '<option>'.$result['name'].'</option>';

}
echo '<option value="'.$result['tag_id'].'">   '.$result['tag'].'</option>';

}
echo '</select>';

Пример у себя проверила. Смысл: ставим счетчик $p, если он не равен id категории, то он забирает себе ид категории, а значит категория выводится 1 раз, в то время как цикл по строкам идет и подкатегории выводятся в цикле. Таким образом к одной категории идет несколько подкатегорий. Я этот прием часто использую, когда вывожу товар в категории, поэтому привыкла ставить $p=-1, товар может быть без категории, т.е. $result['cat_id'] будет 0 и тогда $p=0 не сработает.

Спустя 58 минут, 57 секунд (23.10.2011 - 17:34) T0L1K.IT написал(а):
Лена
Огромное спасибо:)
Проблема решена.

Спустя 7 месяцев, 9 дней, 20 часов, 2 минуты, 7 секунд (3.06.2012 - 13:36) VladisOK написал(а):
Здравствуйте Лена, меня тоже интересует нечто подобное но со связями трёх таблиц:

<label>Выбрать марку: <select name="1" id="1">
<option value="0">----</option>
<option value="1">Alfa Romeo</option>
<option value="2">Audi</option>
<option value="3">BMW</option>
</select>
</label>
<p>&nbsp;</p>
<label>Выбрать модель: <select name="1" id="1">
<option value="0">----</option>
<option value="1">A 3</option>
<option value="2">A 4</option>
<option value="3">A 6</option>
</select>
</label>
<p>&nbsp;</p>
<label>Выбрать модификацию: <select name="1" id="1">
<option value="0">----</option>
<option value="1"> 1.6</option>
<option value="2"> 1.8</option>
<option value="3"> 2.0</option>
</select>
</label>

Проблема в том, что в админке сделано добавление товара с выбором категории (выпадающий список) при выборе категории в выпадающем списке под категорий - появляются все под категории ранее добавленные в данную категорию. И далее необходимо сделать чтоб появлялись под под категории в выпадающем списке, чтобы бы добавить товар.

В данный момент система работает с добавлением товара в под категорию, до выбора добавления в под под категорию.
Задача для меня не выполнимая самостоятельно. Уже долго вожусь - не как.

Таблицы:
--
-- Структура таблицы `category`
--

CREATE TABLE IF NOT EXISTS `category` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_type` int(10) unsigned NOT NULL,
`title` varchar(255) character set utf8 NOT NULL,
`descr` text character set utf8 NOT NULL,
`ord` int(10) unsigned NOT NULL,
`logoprev` varchar(100) collate utf8_bin NOT NULL,
`prev` varchar(100) collate utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=55 ;

-
-- Структура таблицы `pod_category`
--

CREATE TABLE IF NOT EXISTS `pod_category` (
`id` int(10) unsigned NOT NULL auto_increment,
`sub` int(10) NOT NULL,
`id_type` int(10) unsigned NOT NULL,
`title` varchar(255) character set utf8 NOT NULL,
`lang` char(2) character set utf8 NOT NULL,
`name` varchar(255) character set utf8 NOT NULL,
`ord` int(10) unsigned NOT NULL,
`prev` varchar(100) collate utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1095 ;

--
--
-- Структура таблицы `pod_category2`
--

CREATE TABLE IF NOT EXISTS `pod_category2` (
`id` int(10) unsigned NOT NULL auto_increment,
`sub2` int(10) NOT NULL,
`id_type` int(10) unsigned NOT NULL,
`title2` varchar(255) character set utf8 NOT NULL,
`kod_dv` varchar(100) character set utf8 NOT NULL,
`tip_dv` char(1) character set utf8 NOT NULL default '0',
`tip_dv2` char(1) character set utf8 NOT NULL default '0',
`vm_dv` varchar(100) character set utf8 NOT NULL,
`max_dv` varchar(100) character set utf8 NOT NULL,
`god_dv` varchar(100) character set utf8 NOT NULL,
`lang` char(2) character set utf8 NOT NULL,
`name2` varchar(255) character set utf8 NOT NULL,
`ord` int(10) unsigned NOT NULL,
`prev2` varchar(100) collate utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4156 ;

--

Спустя 1 час, 45 минут, 11 секунд (3.06.2012 - 15:22) Лена написал(а):
VladisOK
У вас не то же самое. T0L1K.IT сразу все категории и подкатегории.
Вам надо при выборе категории подгружать подкатегории этой категории, при выборе подкатегории - подгружать 3 уровень. Это чаще всего решается через ajax, разными способами.
Открывайте новую тему и показывайте свой код.

Спустя 38 минут, 43 секунды (3.06.2012 - 16:00) VladisOK написал(а):
Создал новую тему:

Форум PHP программистов / PHP практикум / PHP + SQL / Связи трёх таблиц

http://phpforum.ru/index.php?showtopic=61992

Спустя 14 минут, 35 секунд (3.06.2012 - 16:15) VladisOK написал(а):
Цитата (Лена @ 3.06.2012 - 12:22)
VladisOK
У вас не то же самое. T0L1K.IT сразу все категории и подкатегории.
Вам надо при выборе категории подгружать подкатегории этой категории, при выборе подкатегории - подгружать 3 уровень. Это чаще всего решается через ajax, разными способами.
Открывайте новую тему и показывайте свой код.

Всё сделал как просили:
http://phpforum.ru/index.php?showtopic=61992
Быстрый ответ:

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