Нужно вывести из бд категории и подкатегории в выпадающий список.
Делал так:
$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. Поэтому у вас сепаратор не срабатывал, по умолчанию там запятая.
Что выходит:
Но и это вам не поможет.
По-моему, вам надо как-то так:
Если не поможет, дайте структуру таблиц.
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) Лена написал(а):
Вам группировки здесь не нужны.
Пример у себя проверила. Смысл: ставим счетчик $p, если он не равен id категории, то он забирает себе ид категории, а значит категория выводится 1 раз, в то время как цикл по строкам идет и подкатегории выводятся в цикле. Таким образом к одной категории идет несколько подкатегорий. Я этот прием часто использую, когда вывожу товар в категории, поэтому привыкла ставить $p=-1, товар может быть без категории, т.е. $result['cat_id'] будет 0 и тогда $p=0 не сработает.
$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> </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> </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 ;
--
<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> </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> </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, разными способами.
Открывайте новую тему и показывайте свой код.
У вас не то же самое. T0L1K.IT сразу все категории и подкатегории.
Вам надо при выборе категории подгружать подкатегории этой категории, при выборе подкатегории - подгружать 3 уровень. Это чаще всего решается через ajax, разными способами.
Открывайте новую тему и показывайте свой код.
Спустя 38 минут, 43 секунды (3.06.2012 - 16:00) VladisOK написал(а):
Создал новую тему:
Форум PHP программистов / PHP практикум / PHP + SQL / Связи трёх таблиц
http://phpforum.ru/index.php?showtopic=61992
Форум 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, разными способами. Открывайте новую тему и показывайте свой код. |