SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#26 15.08.2013 16:27:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

Можно здесь, конкретизируйте вопрос.

Неактивен

 

#27 15.08.2013 16:30:41

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Лучше неверно будет тут продолжить, так будет понятнее smile

Здравствуйте! Нужна ваша профессиональная помощь. Нужно составить запрос, или запросы, для поиска картинок по ключевым словам.

Структура табличек:

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

CREATE TABLE IF NOT EXISTS `images` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `category_id` smallint(5) unsigned NOT NULL,
  `title` varchar(100) NOT NULL,
  `filesize` int(8) unsigned NOT NULL,
  `width` smallint(4) unsigned NOT NULL,
  `height` smallint(4) unsigned NOT NULL,
  `color` char(6) NOT NULL,
  `color_percent` decimal(4,2) unsigned NOT NULL,
  `upload_date` int(10) unsigned NOT NULL,
  `views` int(10) unsigned NOT NULL DEFAULT '0',
  `downloads` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `category_id` (`category_id`),
  KEY `color` (`color`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


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

CREATE TABLE IF NOT EXISTS `tags` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `image_id` int(10) unsigned NOT NULL,
  `category_id` smallint(5) unsigned NOT NULL,
  `tag` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `image_id` (`image_id`),
  KEY `category_id` (`category_id`),
  KEY `tag` (`tag`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;



Задача:

Нужно выбрать, SELECT `images`.* FROM `images` в которых есть например слово 'красивая', ключевые слова хранятся в табличке `tags`, поле `image_id`, указывает на то к какой картинке принадлежит это слово. Выше мы уже разобрались как слова записываются в табличку `tags` как там все это выглядит и храниться, думаю должно быть понятно. При всем этом, во время выборки нужно учитывать категорию, тоесть, нужно чтобы сначала в выборке шли картинки которые, относятся к конкретной категории, например id категории 5, после чего идут картинки из всех остальных категорий. Также отсортировать их по id таблицы `images`, чтобы сначала шли новые а потом старые, тоесть, с более больших id к более маленьким.

Не знаю, мне кажется именно так должен работать поиск, если я не прав то подскажите как обычно это делают, просто решаю такую задачу впервые.

Вот такая сложная задачка smile, не знаю как для Вас, но для меня не выполнимая, я конечно могу решить ее за счет средств PHP, циклов и т.д, но это будет ужас и кошмар, нагрузка будут ужасная. Можете составить запрос, или тут только в несколько запросов? Надеюсь на любую вашу помощь и советы, и пожалуйста проверьте также, правильно ли я сделал индексы у таблиц? Если еще нужна будет какая-то информация, скажите я добавлю любую необходимую информацию.

Неактивен

 

#28 15.08.2013 16:38:19

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Вот для примера часть странички, где виден результат работы, той задачи которую мы вчера решали, красным цветом подсвечиваются ключевые слова, которые еще повторяются в других картинках и рядом цифра сколько еще есть картинок с таким словом. А сейчас мы решаем задачку, когда пользователь нажмет на нужное ему слово, и начнется та самая выборка, и ему отобразятся все картинки, в которых есть такое слово, сначала из этой категории а потом из всех оставшихся.

Неактивен

 

#29 15.08.2013 16:40:29

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Чего-то не получилось картинку вставить, не пойму как она тут у вас вставляется, нажал обзор, выбрал, а она не вставилась smile

О разобрался smile

Отредактированно Debian (15.08.2013 16:43:04)


Прикрепленные файлы:
Attachment Icon 1.jpg, Размер: 306,704 байт, Скачано: 336

Неактивен

 

#30 15.08.2013 16:45:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

SELECT i.* FROM images i JOIN
(SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t ON i.image_id=t.image_id
ORDER BY if(category_id=5,1,2), i.id DESC;


1. Вместо * лучше явно указывать нужные поля.
2. Необходимость тех или иных индексов зависит от запросов. Посмотрите FAQ №5
3. Зачем в таблице тегов дублируется category_id?

Неактивен

 

#31 15.08.2013 17:19:09

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

1. Вместо * лучше явно указывать нужные поля.

Ага, я знаю, это просто для примера.

2. Необходимость тех или иных индексов зависит от запросов. Посмотрите FAQ №5

Тоже знаю, но там как раз все индексы почти для этой работы с ключевыми словами, кроме:

KEY `user_id` (`user_id`)
KEY `color` (`color`)


3. Зачем в таблице тегов дублируется category_id?

Думал так будет легче, Вам придумать запрос smile Лишнее, удалить?

Ошибочку выдает ваш запрос.

mysql> SELECT i.* FROM images i JOIN
    -> (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t ON i.image_id=t.image_id
    -> ORDER BY if(category_id=5,1,2), i.id DESC;
ERROR 1054 (42S22): Unknown column 'i.image_id' in 'on clause'

Неактивен

 

#32 15.08.2013 17:29:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

Вместо i.image_id очевидно нужно i.id

Неактивен

 

#33 15.08.2013 17:48:17

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Вау smile Безупречно smile Возле меня сидит товарищ, у него, да что там у него, у нас обоих челюсти поотваливались smile

Супер, вы бог MySQL smile Огромное приогромное Вам спасибо smile В точности по каждому пункту из моего задания, все условия выполняются smile Я уже люблю ваш форум smile Тут одни настоящие профи.

А вот тут:

ORDER BY if(category_id=5,1,2)


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

Хотя я вставил Ваш запрос без изменений, а картинки у меня сейчас только в 5 и 6 категории, а он все равно вывел из 6 так как положено. Объясните пожалуйста, что мне тут перечислять (category_id=5,1,2) ?

Отредактированно Debian (15.08.2013 17:54:25)

Неактивен

 

#34 15.08.2013 18:01:42

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

И вот что показывает explain:

mysql> explain SELECT i.* FROM images i JOIN
    -> (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t ON i.id=t.image_id
    -> ORDER BY if(category_id=5,1,2), i.id DESC;
+----+-------------+------------+--------+---------------+---------+---------+------------+------+-----------------------------------------------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref        | rows | Extra                                               |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+-----------------------------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL       |    6 | Using temporary; Using filesort                     |
|  1 | PRIMARY     | i          | eq_ref | PRIMARY       | PRIMARY | 4       | t.image_id |    1 | NULL                                                |
|  2 | DERIVED     | tags       | ref    | image_id,tag  | tag     | 152     | const      |    6 | Using index condition; Using where; Using temporary |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+-----------------------------------------------------+
3 rows in set (0.00 sec)

mysql>

Это нормально или может как-то индексы еще нужно правильно сделать? Я просто в первые вижу такое <derived2>.

Неактивен

 

#35 15.08.2013 18:09:16

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

if(category_id=5,1,2)
если category_id = 5, то результатом функции будет 1, в противном случае 2

Таким образом в результате сортировки пойдут сначала картинки из 5ой категории, потом все остальные.
Средствами php вам нужно указывать только номер той категории, которая должна быть впереди. В данном примере это 5.

Неактивен

 

#36 15.08.2013 18:28:56

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

vasya написал:

if(category_id=5,1,2)
если category_id = 5, то результатом функции будет 1, в противном случае 2

Таким образом в результате сортировки пойдут сначала картинки из 5ой категории, потом все остальные.
Средствами php вам нужно указывать только номер той категории, которая должна быть впереди. В данном примере это 5.

Ааа, все, теперь я понял, спасибочки smile

А по индексам я так понял все нормально, вот это так и должно быть?

1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL       |    6 | Using temporary; Using filesort

Неактивен

 

#37 15.08.2013 18:35:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

Debian написал:

Я просто в первые вижу такое <derived2>.

Это означает, что речь идет о таблице, полученной в результате выполнения подзапроса (см последнюю строку в explain, где тип доступа DERIVED и id=2).

Что касается улучшения, то разбивать на отдельные запросы. См http://webew.ru/articles/4856.webew

Неактивен

 

#38 15.08.2013 18:40:38

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Хорошо, спасибо большое, почитаю сейчас smile

Неактивен

 

#39 15.08.2013 19:36:51

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Сейчас немного поэксперементировал с индексами под этот запрос:

mysql> explain SELECT i.* FROM images i JOIN
    -> (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t ON i.id=t.image_id
    -> ORDER BY if(category_id=5,1,2), i.id DESC;
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref        | rows | Extra                           |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL       |   86 | Using temporary; Using filesort |
|  1 | PRIMARY     | i          | eq_ref | PRIMARY       | PRIMARY | 4       | t.image_id |    1 | NULL                            |
|  2 | DERIVED     | tags       | ALL    | NULL          | NULL    | NULL    | NULL       |   86 | Using where; Using temporary    |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
3 rows in set (0.00 sec)

mysql> explain SELECT i.* FROM images i JOIN
    -> (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t ON i.id=t.image_id
    -> ORDER BY if(category_id=5,1,2), i.id DESC;
+----+-------------+------------+--------+---------------+---------+---------+------------+------+-----------------------------------------------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref        | rows | Extra                                               |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+-----------------------------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL       |    6 | Using temporary; Using filesort                     |
|  1 | PRIMARY     | i          | eq_ref | PRIMARY       | PRIMARY | 4       | t.image_id |    1 | NULL                                                |
|  2 | DERIVED     | tags       | ref    | tag           | tag     | 152     | const      |    6 | Using index condition; Using where; Using temporary |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+-----------------------------------------------------+
3 rows in set (0.00 sec)

mysql> explain SELECT i.* FROM images i JOIN
    -> (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t ON i.id=t.image_id
    -> ORDER BY if(category_id=5,1,2), i.id DESC;
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref        | rows | Extra                           |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL       |    6 | Using temporary; Using filesort |
|  1 | PRIMARY     | i          | eq_ref | PRIMARY       | PRIMARY | 4       | t.image_id |    1 | NULL                            |
|  2 | DERIVED     | tags       | ref    | tag           | tag     | 152     | const      |    6 | Using where; Using index        |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
3 rows in set (0.00 sec)

mysql> explain SELECT i.* FROM images i JOIN
    -> (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t ON i.id=t.image_id
    -> ORDER BY if(category_id=5,1,2), i.id DESC;
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref        | rows | Extra                                 |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL       |   44 | Using temporary; Using filesort       |
|  1 | PRIMARY     | i          | eq_ref | PRIMARY       | PRIMARY | 4       | t.image_id |    1 | NULL                                  |
|  2 | DERIVED     | tags       | range  | tag           | tag     | 156     | NULL       |   44 | Using where; Using index for group-by |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------------+
3 rows in set (0.01 sec)

mysql> explain SELECT i.* FROM images i JOIN
    -> (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t ON i.id=t.image_id
    -> ORDER BY if(category_id=5,1,2), i.id DESC;
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref        | rows | Extra                           |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL       |    6 | Using temporary; Using filesort |
|  1 | PRIMARY     | i          | eq_ref | PRIMARY       | PRIMARY | 4       | t.image_id |    1 | NULL                            |
|  2 | DERIVED     | tags       | ref    | tag           | tag     | 92      | const      |    6 | Using where                     |
+----+-------------+------------+--------+---------------+---------+---------+------------+------+---------------------------------+
3 rows in set (0.00 sec)

mysql>

Какой из этих вариантов самый оптимальный? Я так понимаю, что наверно последний? И не поделитесь информацией, где можно почитать про explain, на русском и доступным понятным языком?

Неактивен

 

#40 15.08.2013 19:58:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

Третий.
Но основная проблема это Using filesort, который индексами не исправить. С другой стороны раньше времени можно и не оптимизировать, тем более, что в таблице у вас не хранится сама картинка, так что проблем с производительностью может и не быть.

Насчет русского не скажу, самое полное в доке (http://dev.mysql.com/doc/refman/5.5/en/ … utput.html), но есть русские переводы (хотя и устаревших версий, например, http://www.linuxlib.ru/mysqloff/EXPLAIN.html)

Неактивен

 

#41 15.08.2013 20:08:33

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Спасибо smile

Неактивен

 

#42 15.08.2013 21:03:36

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

А можете еще немного подправить запрос? Я просто совсем забыл, что еще нужно получить имя категории, и логин пользователя, и они нужны в этомже запросе. Я приведу примеры как я делаю это для других типов выборки: по категориям, по цвету, и по всем, а также новый вид выборки, который вы мне дали, и покажу еще 2 таблички, `users` и `categories`, а Вы, если конечно это возможно, подправте пожалуйста запрос, который вы делали, а то совсем из головы вылетело, уже когда начал PHP реализовывать, вспомнил про эту деталь.

Таблички:

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

CREATE TABLE IF NOT EXISTS `categories` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `position` smallint(5) unsigned NOT NULL,
  `name` varchar(30) NOT NULL,
  `alias` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

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

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `login` varchar(20) NOT NULL,
  `password` char(62) NOT NULL,
  `email` varchar(255) NOT NULL,
  `registration_date` int(10) unsigned NOT NULL,
  `last_active` int(10) unsigned NOT NULL DEFAULT '0',
  `status` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `notice` varchar(255) NOT NULL DEFAULT '0',
  `hash` char(32) NOT NULL,
  `group` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `uploads` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `downloads` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `comments` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `error_password` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`(10)),
  UNIQUE KEY `hash` (`hash`(10)),
  UNIQUE KEY `login` (`login`(10))
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



И варианты как я делал для других видов выборки, что бы вам было понятнее, что мне нужно.

if($type == 'category'){
    $query = "SELECT `images`.*, `categories`.`name`, `users`.`login` FROM `images` JOIN `categories` JOIN `users`
              ON `images`.`category_id` = '$sort' AND `images`.`category_id` = `categories`.`id`
              AND `images`.`user_id` = `users`.`id` ORDER BY `upload_date` DESC LIMIT $start, $limit"
;
}else if($type == 'color'){
    $query = "SELECT `images`.*, `categories`.`name`, `users`.`login` FROM `images` JOIN `categories` JOIN `users`
              ON `images`.`color` = '$sort' AND `images`.`category_id` = `categories`.`id`
              AND `images`.`user_id` = `users`.`id` ORDER BY `color_percent` DESC LIMIT $start, $limit"
;
}else if($type == 'tag'){
    $query = "SELECT i.* FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag='$sort') t ON i.id=t.image_id
              ORDER BY if(category_id=5,1,2), i.id DESC"
;
}else{
    $query = "SELECT `images`.*, `categories`.`name`, `users`.`login` FROM `images` JOIN `categories` JOIN `users`
              ON `images`.`category_id` = `categories`.`id` AND `images`.`user_id` = `users`.`id`
              ORDER BY `upload_date` DESC LIMIT $start, $limit"
;
}


И также еще нужно в него правильно добавить DESC LIMIT $start, $limit, а то я пока до конца не осмыслил ваш запрос, и не пойму как это сделать что бы его не нарушить.

Неактивен

 

#43 15.08.2013 21:20:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

"SELECT ... FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag='$sort') t JOIN `categories` JOIN `users`
ON i.id=t.image_id AND `images`.`category_id` = `categories`.`id` AND `images`.`user_id` = `users`.`id`
ORDER BY if(category_id=5,1,2), i.id DESC LIMIT $start, $limit"

Неактивен

 

#44 15.08.2013 21:37:22

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Где-то что-то не так, ошибочка:

mysql> SELECT i.* FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') t JOIN `categories` JOIN `users`
    -> ON i.id=t.image_id AND `images`.`category_id` = `categories`.`id` AND `images`.`user_id` = `users`.`id`
    -> ORDER BY if(category_id=5,1,2), i.id DESC LIMIT 1, 5;
ERROR 1054 (42S22): Unknown column 'images.category_id' in 'on clause'


Может это из-за того что я вот так сделал.
SELECT i.*

Отредактированно Debian (15.08.2013 21:48:53)

Неактивен

 

#45 15.08.2013 22:05:41

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Наверно вы вот так хотели сделать? Просто вы назначили псевдоним images i а потом снова начали использовать images а не i.

Я не уверен проверьте пожалуйста, он заработал, но мало ли что.

$query = "SELECT `i`.*, `categories`.`name`, `users`.`login` FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag='$sort') t JOIN `categories` JOIN `users`
ON i.id=t.image_id AND `i`.`category_id` = `categories`.`id` AND `i`.`user_id` = `users`.`id`
ORDER BY if(category_id=5,1,2), i.id DESC LIMIT $start, $limit"
;

Неактивен

 

#46 15.08.2013 22:07:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

`images`.`category_id` --> `i`.`category_id`
`images`.`user_id --> `i`.`user_id

Неактивен

 

#47 15.08.2013 22:08:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

Да, все так, только * в рабочем запросе писать не стоит.

Неактивен

 

#48 15.08.2013 22:10:11

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Ага, уже сам догадался ) А еще подскажите, вот эти запросы что выше я показал, я просто их сам делал, но поскольку я не особо хорошо пока еще понимаю MySQL, может там что-то можно улучшить? Может я что-то не так сделал?

Неактивен

 

#49 15.08.2013 22:13:36

Debian
Завсегдатай
Откуда: Украина г. Донецк
Зарегистрирован: 14.08.2013
Сообщений: 72

Re: Подсчитать количество одинаковых тегов.

Да вот я как раз и думаю над этой звездочкой, дело в том что эти запросы используются и на сайте и в админке, в админке почти все поля нужны, на сайте нет, и если перечислять поля, то придется еще делать копию всех этих запросов, для админки и для сайта, + там полей много получается огромнейший кусок кода, в 8 запросов, которые по сути всего отличаются в пару полей, вот я и думаю, а стоит ли оно того? Действительно ли на столько разница?

Отредактированно Debian (15.08.2013 22:21:12)

Неактивен

 

#50 15.08.2013 22:26:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчитать количество одинаковых тегов.

Лишние данные выбираются, сортируются, передаются. Разница зависит от объема лишних данных и нагрузки. В вашем случае скорее всего невелика.
Ну и нужно учитывать, что даже если сегодня вам нужны все поля и вы поставили *, то завтра можете добавить в таблицу новые поля типа text/blob, которые в запросе не нужны, а * исправить забудете.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson