Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Имя таблицы в условии like
 
 автор: Zdraff   (09.04.2010 в 23:58)   письмо автору
 
 

Здравствуйте. У меня есть запрос:
SELECT
mt_partgroups.group_id as group_id,
mt_partgroups.group_name as group_name,
mt_partgroups.group_parent as group_parent,
count(mt_partsdeclaration.id) AS count
FROM mt_partgroups, mt_partsdeclaration
WHERE
mt_partsdeclaration.model_id = '0' AND
mt_partsdeclaration.part_group LIKE ('%|no') AND
mt_partsdeclaration.status = '0'
GROUP BY group_name

Нужно вместо условия "mt_partsdeclaration.part_group LIKE ('%|no')" сделать
"mt_partsdeclaration.part_group LIKE ('mt_partgroups.group_id|%')". Естественно, в таком виде это не работает, как правильно написать, не знаю, прошу помощи. Думаю, понятно, что требуется.

  Ответить  
 
 автор: Zdraff   (12.04.2010 в 02:46)   письмо автору
 
   для: Zdraff   (09.04.2010 в 23:58)
 

Вопрос сложный или криво поставленный? :)

  Ответить  
 
 автор: Trianon   (12.04.2010 в 03:37)   письмо автору
 
   для: Zdraff   (09.04.2010 в 23:58)
 

схема кривая.
в прямой схеме не будет поля part_group

  Ответить  
 
 автор: Zdraff   (12.04.2010 в 09:55)   письмо автору
 
   для: Trianon   (12.04.2010 в 03:37)
 

Что плохого в том, что каждой запчасти присвоена группа (например, "Компоненты двигателя")?

  Ответить  
 
 автор: Trianon   (12.04.2010 в 10:08)   письмо автору
 
   для: Zdraff   (12.04.2010 в 09:55)
 

так.
Вы бы привели структуры таблиц, а то как-то непонятно, кому и что присвоено.
Я вижу, что в поле part_group у Вас некий композитный материал живет, и индеком для него не воспользоваться.

Еще я вижу, что у Вас полное декартово произведение (табличная операция запятая - JOIN без ON), чтоо тоже восторга не добавляет.
Собственно её Вы и пытаетесь ограничить этим LIKE.

  Ответить  
 
 автор: Zdraff   (12.04.2010 в 10:49)   письмо автору
 
   для: Trianon   (12.04.2010 в 10:08)
 

В запросе участвуют две таблицы, mt_partsdeclaration и mt_partgroups, первая содержит в себе информацию об объявлениях о продаже запчастей, а вторая содержит группы и подгруппы запчастей (поля: group_id, group_name, group_parent). Поле mt_partsdeclaration.part_group содержит информацию вида "группа|подгруппа", т.е. id-шники групп и подгрупп (знаю, что можно было ограничиться хранением только подгруппы, но возникали проблемы с редактированием объявлений). В том случае, если подгруппа не выбрана или группа не содержит подгрупп, в поле хранится информация "группа|no". Собственно, все эти напряги для того, чтобы сделать страничку, где будут показываться ссылки на группы и подгруппы запчастей, рядом с которыми будет в скобочках указано кол-во объявлений в каждой группе/подгруппе.

  Ответить  
 
 автор: Trianon   (12.04.2010 в 11:02)   письмо автору
 
   для: Zdraff   (12.04.2010 в 10:49)
 

>Поле mt_partsdeclaration.part_group содержит информацию вида "группа|подгруппа", т.е. id-шники групп и подгрупп (знаю, что можно было ограничиться хранением только подгруппы, но возникали проблемы с редактированием объявлений)

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

Более детально не отвечу, так как структуру таблиц (SHOW CREATE TABLE ) Вы не привели.

  Ответить  
 
 автор: Zdraff   (12.04.2010 в 11:30)   письмо автору
 
   для: Trianon   (12.04.2010 в 11:02)
 

CREATE TABLE `mt_partgroups` (
`group_id` mediumint(9) NOT NULL auto_increment,
`group_name` varchar(100) NOT NULL,
`group_parent` mediumint(9) NOT NULL default '0',
PRIMARY KEY (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `mt_partsdeclaration` (
`id` int(10) unsigned NOT NULL auto_increment,
`author_id` int(11) NOT NULL,
`prod` mediumint(9) NOT NULL,
`model_id` smallint(5) unsigned NOT NULL,
`modif_id` smallint(5) unsigned NOT NULL,
`modif_name` varchar(50) NOT NULL,
`part_group` varchar(10) NOT NULL,
`part_type` tinyint(4) NOT NULL,
`part_name` varchar(70) NOT NULL,
`price` int(10) unsigned NOT NULL,
`state` tinyint(4) NOT NULL,
`presence` tinyint(4) NOT NULL,
`haggle` tinyint(4) NOT NULL,
`description` text NOT NULL,
`city` varchar(50) NOT NULL,
`contact_face` varchar(100) NOT NULL,
`face_type` tinyint(4) NOT NULL,
`tel_1` varchar(100) NOT NULL,
`tel_2` varchar(100) NOT NULL,
`tel_3` varchar(100) NOT NULL,
`foto_0` varchar(25) NOT NULL,
`foto_1` varchar(25) NOT NULL,
`foto_2` varchar(25) NOT NULL,
`show_profile_link` tinyint(4) NOT NULL default '0',
`placing_date` date NOT NULL,
`placing_until` date NOT NULL,
`status` tinyint(3) unsigned NOT NULL,
`looked` tinyint(3) unsigned NOT NULL,
`views` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Подгруппа означает группу, но случается так, что группа не имеет подгрупп. Ладно, понял, буду хранить только значение конечной подгруппы (или группы без подгрупп), так будет правильно, но когда уткнусуь в то, что мне помешало сделать с самого начала это, буду с Вас спрашивать :). Спасибо за помощь!

  Ответить  
 
 автор: Trianon   (12.04.2010 в 12:13)   письмо автору
 
   для: Zdraff   (12.04.2010 в 11:30)
 

С меня Вы спрашивать будете тогда, когда
а) закажете мне проектирование схемы,
и б) оплатите заказ.
Это при том, что ввязываться в Ваш проект я, мягко говоря, не рвусь.

  Ответить  
 
 автор: Zdraff   (12.04.2010 в 12:53)   письмо автору
 
   для: Trianon   (12.04.2010 в 12:13)
 

Да ладно, я шучу (там смайлик стоит), конечно, Вы мне ничем не обязаны.

  Ответить  
 
 автор: Zdraff   (12.04.2010 в 14:09)   письмо автору
 
   для: Zdraff   (12.04.2010 в 11:30)
 

В общем, переделал, теперь в mt_partsdeclaration.part_group хранится число - ID подгруппы запчасти (или группы, если подгрупп у этой группы нет). Теперь проблема вывести все это красивым списком. Из всех испытанных, лучше всего работает запрос
            SELECT 
                mt_partgroups.*,
                count(mt_partsdeclaration.id) AS count
            FROM mt_partgroups, mt_partsdeclaration
            WHERE
                mt_partsdeclaration.model_id = '0' AND    
                (mt_partgroups.group_parent = '0' OR
                mt_partsdeclaration.part_group = mt_partgroups.group_id) AND
                mt_partsdeclaration.status = '0'
            GROUP BY mt_partgroups.group_name
            ORDER BY mt_partgroups.group_name ASC

Он выводит все группы и подгруппы, в которых есть хоть одна запчасть. Но неправильно считает кол-во запчастей в группах. Пробовал через left join - та же фигня. Подскажите, пожалуйста, как реализовать.

  Ответить  
 
 автор: Zdraff   (12.04.2010 в 16:23)   письмо автору
 
   для: Zdraff   (12.04.2010 в 14:09)
 

Сделал двумя запросами, тему закрываю, спасибо Trianon за помощь еще раз.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования