подкаректировать запросец в mysql

Статус
В этой теме нельзя размещать новые ответы.

ghostik32

Создатель
Регистрация
26 Янв 2010
Сообщения
40
Реакции
1
есть запрос:
PHP:
mysql_query ("SELECT * FROM `products` WHERE mesto_proizvodstva = '$city' AND (name LIKE '%{$search_text}%' OR keyword LIKE '%{$search_text}%' OR discription LIKE '%{$search_text}%') ORDER BY view DESC");
он ищет совпадения слов в 3 полях и сортирует по количеству просмотров (view), нужно както добавить чтобы он смотрел в ещё одну таблицу (users) доставал из неё столбец (premium) и если в ней "1" то независимо от кол-ва просмотров (view) выводил на первое место (если у нескольких юзеров есть premium то сортируется по "view"). Вот както так =)
 
если у тебя таблички связаны через поле id (что вряд ли), то запрос будет приблизительно таким
PHP:
SELECT 
	`products`.`mesto_proizvodstva`, 
	`products`.`name`, 
	`products`.`keyword`,
	`products`.`discription`
FROM 
	`products`,
	`users` 
WHERE 	(
	(
	`products`.`mesto_proizvodstva` = '$city' 
	AND 
		(`products`.`name` LIKE '%{$search_text}%' 
	OR 
		`products`.`keyword` LIKE '%{$search_text}%' 
	OR
		`products`.`discription` LIKE '%{$search_text}%')
	)
OR 
	`users`.`premium` = 1
AND
	`users`.`id` = `products`.`id`
)
ORDER BY
	`users`.`premium` DESC, `view` DESC
обрати внимание, что в самом последнем условии
PHP:
AND `users`.`id` = `products`.`id`
надо заменить оба id на те поля из таблиц, которыми они связаны.
названия таблиц перед всеми полями проставил, т.к. неясно какие поля могут иметь одинаковые названия в обоих таблицах.
если не будет работать - выкладывай структуру таблиц
 
Лучше наверное так
PHP:
SELECT 
    `products`.`mesto_proizvodstva`, 
    `products`.`name`, 
    `products`.`keyword`,
    `products`.`discription`
FROM 
    `products`
INNER JOIN `users` 
WHERE     (
    (
    `products`.`mesto_proizvodstva` = '$city' 
    AND 
        (`products`.`name` LIKE '%{$search_text}%' 
    OR 
        `products`.`keyword` LIKE '%{$search_text}%' 
    OR
        `products`.`discription` LIKE '%{$search_text}%')
    )
OR 
    `users`.`premium` = 1
AND
    `users`.`id` = `products`.`id`
)
ORDER BY
    `users`.`premium` DESC, `view` DESC

Заменить `products`,`users` на INNER JOIN `users`
 
попробовал но почемуто не получилось, выводит в беспорядочном виде их както.
Может я что-то не так обьяснил.
Вот дамп таблиц:
PHP:
CREATE TABLE `users` (
  `id` int(7) NOT NULL auto_increment,
  `firstName` varchar(20) default NULL,
  `lastName` varchar(20) default NULL,
  `patronymic` varchar(20) default NULL,
  `sex` varchar(6) default NULL,
  `logo` varchar(128) default NULL,
  `companyID` int(6) NOT NULL default '0',
  `telefone` varchar(30) default NULL,
  `fax` varchar(50) default NULL,
  `mobile` varchar(30) default NULL,
  `country` int(3) default NULL,
  `typeAccount` varchar(10) default NULL,
  `email` varchar(128) default NULL,
  `altEmail` varchar(128) default NULL,
  `password` varchar(60) default NULL,
  `jobTitle` varchar(32) default NULL,
  `goldMember` int(1) default NULL,
  `street` varchar(250) default NULL,
  `city` varchar(80) default NULL,
  `oblast` varchar(128) default NULL,
  `zipCode` varchar(12) default NULL,
  `secret_question` varchar(40) default NULL,
  `secret_answer` varchar(30) default NULL,
  `ban` int(1) default NULL,
  `credits` int(15) default NULL,
  `hash` varchar(90) default NULL,
  `link_forgot` text,
  `premium` int(1) default NULL,
  `premium_end` varchar(20) default NULL,
  `joined` int(15) default NULL,
  `ip` varchar(20) default NULL,
  `brauser` text,
  `online` int(1) default NULL,
  `last_time` int(12) default NULL,
  `last_ip` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=cp1251;
PHP:
CREATE TABLE `products` (
  `id` int(20) NOT NULL auto_increment,
  `ownerId` int(10) NOT NULL,
  `name` varchar(128) default NULL,
  `keyword` varchar(50) default NULL,
  `subCategories` int(6) default NULL,
  `mesto_proizvodstva` int(6) default NULL,
  `region_gorod` varchar(56) default NULL,
  `discription` text,
  `min_zakaz` varchar(20) default NULL,
  `min_zakaz_izmerenie` varchar(50) default NULL,
  `min_zakaz_other` varchar(50) default NULL,
  `cena_tip_plateza` varchar(40) default NULL,
  `cena_min` varchar(20) default NULL,
  `cena_max` varchar(30) default NULL,
  `cena_tip_izmereniya` varchar(50) default NULL,
  `uslovie_dostavki` varchar(128) default NULL,
  `srok_postavki` varchar(128) default NULL,
  `uslovie_oplaty` varchar(250) default NULL,
  `uslovie_oplaty_other` varchar(128) default NULL,
  `moshnosti` varchar(128) default NULL,
  `moshnosti_tip_izmereniya` varchar(50) default NULL,
  `moshnosti_time` varchar(10) default NULL,
  `moshnosti_other` varchar(128) default NULL,
  `upakovka` varchar(510) default NULL,
  `logo` varchar(128) default NULL,
  `kogda_dobavlen` int(12) default NULL,
  `view` int(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=52 DEFAULT CHARSET=cp1251;

Суть такая: В поля поиска юзеры вводят что хотят найти, запрос должен пробежаться по полям "name,keyword,discription" в таблице "products" и глянуть в поле "premium" таблицы "users", если поле премимум "1" то эти товары выводить на первые места, а если несколько юзеров имеют "premium" = 1 то уже сортировать по "products" "view". Те юзеры у которыч "premium" = 0 то их выводить после тех у кого "premium" = 1, и сортировать их по "view".
Знаю запросец не простой но кто поможет отблагодарю материально!

Добавлено через 2 минуты
Лучше наверное так
PHP:
SELECT 
    `products`.`mesto_proizvodstva`, 
    `products`.`name`, 
    `products`.`keyword`,
    `products`.`discription`
FROM 
    `products`
INNER JOIN `users` 
WHERE     (
    (
    `products`.`mesto_proizvodstva` = '$city' 
    AND 
        (`products`.`name` LIKE '%{$search_text}%' 
    OR 
        `products`.`keyword` LIKE '%{$search_text}%' 
    OR
        `products`.`discription` LIKE '%{$search_text}%')
    )
OR 
    `users`.`premium` = 1
AND
    `users`.`id` = `products`.`id`
)
ORDER BY
    `users`.`premium` DESC, `view` DESC
Заменить `products`,`users` на INNER JOIN `users`

нехочет так искать
 
Код:
[COLOR=#000000][FONT=Courier New][COLOR=#0000bb]SELECT  
    [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]mesto_proizvodstva[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]`,  
    `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]name[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]`,  
    `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]keyword[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]`, 
    `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]discription[/COLOR][/FONT][COLOR=#007700][FONT=Courier New]` 
[/FONT][/COLOR][FONT=Courier New][COLOR=#0000bb]FROM  
    [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]products[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]` 
[/COLOR][COLOR=#0000bb]INNER JOIN [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]users[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]` ON `[COLOR=#0000bb]users[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700]` = `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700][FONT=Courier New]`[/FONT][/COLOR]  
[/COLOR][COLOR=#0000bb]WHERE     [/COLOR][/FONT][FONT=Courier New][COLOR=#007700]
    `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]mesto_proizvodstva[/COLOR][COLOR=#007700]` = [/COLOR][/FONT][COLOR=#dd0000][FONT=Courier New]'$city'  
    [/FONT][/COLOR][FONT=Courier New][COLOR=#007700]AND  
        (`[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]name[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]LIKE [/COLOR][/FONT][COLOR=#dd0000][FONT=Courier New]'%{$search_text}%'  
    [/FONT][/COLOR][FONT=Courier New][COLOR=#007700]OR  
        `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]keyword[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]LIKE [/COLOR][/FONT][COLOR=#dd0000][FONT=Courier New]'%{$search_text}%'  
    [/FONT][/COLOR][FONT=Courier New][COLOR=#007700]OR 
        `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]discription[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]LIKE [/COLOR][COLOR=#dd0000]'%{$search_text}%'[/COLOR][/FONT][FONT=Courier New][COLOR=#007700] 
         ) 
[/COLOR][/FONT][FONT=Courier New][COLOR=#0000bb]ORDER BY 
    [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]users[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]premium[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]DESC[/COLOR][COLOR=#007700], `[/COLOR][COLOR=#0000bb]view[/COLOR][COLOR=#007700]` [/COLOR][/FONT][COLOR=#0000bb][FONT=Courier New]DESC  [/FONT]
[/COLOR][/COLOR]
 
я, после того, как недавно узрел, что запрос с несложным джойном выполняется в 4 раза дольше, чем по сути своей такой же запрос, состоящий из одного запроса по двум табличкам + вложенный запрос перестал интересоваться джойнами и на данный момент в них я полный ноль. хотя, не спорю - возможно, это просто глюк какой-то конкретной базы, индексов, таблиц или просто хитрое сплетение полей, но факт остается фактом - джойны я не люблю, посему продолжить тему не могу:)
 
JOIN может иметь условие ON
а CROSS JOIN ( или запятая) - не может.
 
я, после того, как недавно узрел, что запрос с несложным джойном выполняется в 4 раза дольше, чем по сути своей такой же запрос, состоящий из одного запроса по двум табличкам + вложенный запрос

Join по сути своей и представляет 2 запроса к таблицам и связыванение выборки по условию. Поэтому если он выполняется в 4 раза дольше, то дело скорее всего в индексах.
 
Немного подкорректировал запросец и вот что получилось:
PHP:
$_SQL = "SELECT
			 products.id,
			 products.ownerId,
			 products.name,
			 products.keyword,
			 products.discription,
			 products.min_zakaz,
			 products.min_zakaz_izmerenie,
			 products.min_zakaz_other,
			 products.mesto_proizvodstva,
			 products.cena_tip_plateza,
			 products.cena_min,
			 products.cena_max,
			 products.cena_tip_izmereniya,
			 products.logo
		 FROM
			 `products`,
		     `users`
		 WHERE
		   checked = '1'
		 AND
		   users.id = products.ownerId
		 AND
		 (
		   products.name LIKE '%{$search_text}%' OR 
		   products.keyword LIKE '%{$search_text}%' OR 
		   products.discription LIKE '%{$search_text}%'
		 )
		 ORDER BY `users`.`premium` DESC, `view` DESC";

Работает как надо. Тут возник ещё один вопрос:
Можно ли в этом запросе сосчитать количество идентичных полей "ownerId" и сложить поля (view) вместе и подставить вместо "view" при сортировке (ORDER BY `users`.`premium` DESC, `view` DESC)?
 
Немного подкорректировал запросец и вот что получилось:
PHP:
$_SQL = "SELECT
			 products.id,
			 products.ownerId,
			 products.name,
			 products.keyword,
			 products.discription,
			 products.min_zakaz,
			 products.min_zakaz_izmerenie,
			 products.min_zakaz_other,
			 products.mesto_proizvodstva,
			 products.cena_tip_plateza,
			 products.cena_min,
			 products.cena_max,
			 products.cena_tip_izmereniya,
			 products.logo
		 FROM
			 `products`,
		     `users`
		 WHERE
		   checked = '1'
		 AND
		   users.id = products.ownerId
		 AND
		 (
		   products.name LIKE '%{$search_text}%' OR 
		   products.keyword LIKE '%{$search_text}%' OR 
		   products.discription LIKE '%{$search_text}%'
		 )
		 ORDER BY `users`.`premium` DESC, `view` DESC";
Работает как надо. Тут возник ещё один вопрос:
Можно ли в этом запросе сосчитать количество идентичных полей "ownerId" и сложить поля (view) вместе и подставить вместо "view" при сортировке (ORDER BY `users`.`premium` DESC, `view` DESC)?

Для того, чтобы сосчитать количество идентичных полей "ownerId" необходимо произвести группировку по ним и дописать count(*), но тогда потеряешь строки.
Есть вариант дописать подзапрос, но это увеличит время обработки

PHP:
$_SQL = "SELECT
			 products.id,
			 products.ownerId,
			 (select count(*) from products ppp where ppp.ownerId =  p.ownerId) as cnt_id, 
			 products.name,
			 products.keyword,
			 products.discription,
			 products.min_zakaz,
			 products.min_zakaz_izmerenie,
			 products.min_zakaz_other,
			 products.mesto_proizvodstva,
			 products.cena_tip_plateza,
			 products.cena_min,
			 products.cena_max,
			 products.cena_tip_izmereniya,
			 products.logo
		 FROM
			 `products` p,
		     `users`
		 WHERE
		   checked = '1'
		 AND
		   users.id = products.ownerId
		 AND
		 (
		   products.name LIKE '%{$search_text}%' OR 
		   products.keyword LIKE '%{$search_text}%' OR 
		   products.discription LIKE '%{$search_text}%'
		 )
		 ORDER BY `users`.`premium` DESC, `view` DESC";
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху