SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#51 15.08.2013 22:32:45

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

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

Ясно, наверно тогда всетаки в итоге перечислю все поля, а что по поводу моих запросов?

И еще вопрос, я тут смотрю он ищет логин (я так понял) по всем пользователям, а там же вроде стоит UNIQUE KEY `login` (`login`(10)), или в этом случае индекс не используется? Это он получается каждый раз на всех страницах сайта, практически, будет сканировать всю базу пользователей? Может можно как-то этого избежать?


mysql> explain SELECT `i`.*, `categories`.`name`, `users`.`login` FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag='красивая') 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 1, 10;
+----+-------------+------------+--------+-----------------------------+--------------+---------+-----------------------+------+---------------------------------+
| id | select_type | table      | type   | possible_keys               | key          | key_len | ref                   | rows | Extra                           |
+----+-------------+------------+--------+-----------------------------+--------------+---------+-----------------------+------+---------------------------------+
|  1 | PRIMARY     | users      | ALL    | PRIMARY                     | NULL         | NULL    | NULL                  |    3 | Using temporary; Using filesort |
|  1 | PRIMARY     | i          | ref    | PRIMARY,user_id,category_id | user_id      | 4       | picksar.users.id      |    1 | NULL                            |
|  1 | PRIMARY     | <derived2> | ref    | <auto_key0>                 | <auto_key0>  | 4       | picksar.i.id          |    2 | Using index                     |
|  1 | PRIMARY     | categories | eq_ref | PRIMARY                     | PRIMARY      | 2       | picksar.i.category_id |    1 | NULL                            |
|  2 | DERIVED     | tags       | ref    | image_id,tag_image_id       | tag_image_id | 152     | const                 |    6 | Using where; Using index        |
+----+-------------+------------+--------+-----------------------------+--------------+---------+-----------------------+------+---------------------------------+
5 rows in set (0.00 sec)

Неактивен

 

#52 16.08.2013 00:22:41

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

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

Debian написал:

Ясно, наверно тогда всетаки в итоге перечислю все поля, а что по поводу моих запросов?

Все нормально, разве что стоит условия на ограничения (типа `images`.`color` = '$sort') лучше писать в части WHERE. Но это вопрос стилистики.


Debian написал:

И еще вопрос, я тут смотрю он ищет логин (я так понял) по всем пользователям, а там же вроде стоит UNIQUE KEY `login` (`login`(10)), или в этом случае индекс не используется? Это он получается каждый раз на всех страницах сайта, практически, будет сканировать всю базу пользователей? Может можно как-то этого избежать?

Порядок объединения таблиц зависит от данных. В данном случае у вас в таблице пользователей всего 3 строчки, вот сервер и решил начать с неё smile

Неактивен

 

#53 16.08.2013 09:48:53

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

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

Ясненько smile Спасибочки smile

Неактивен

 

#54 16.08.2013 11:49:08

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

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

Помогите еще пожалуйста.

Вот запрос который вы делали, я тут внес не большие изменения:

SELECT `i`.`id`, `i`.`title`, `i`.`upload_date`
FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag = 'красивая') t JOIN `categories`
ON `i`.`id` = `t`.`image_id` AND `i`.`category_id` = `categories`.`id` AND `i`.`id` != '10'
ORDER BY if(category_id = 5, 1, 2), i.id DESC LIMIT 3;


Нужно еще сделать запрос, почти такойже, но чтобы он, мог искать не по одному слову, а по нескольким, и только в конкретной категории.

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

Это нужно, чтобы рядом с основной картинкой вывести 3 картинки маленькие, из этого же раздела, со словами которые есть у основной картинки.

Вот это я сделал чтобы он не выводил основную картинку:

AND `i`.`id` != '10'


Это как-то можно сделать, или только в цикле по каждому слову проходить?

Неактивен

 

#55 17.08.2013 10:59:46

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

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

1. В вашем запросе таблица категорий не нужна (если запрос вы привели полностью)

2. По нескольким словам можно сделать с помощью union и после общий limit. (или после каждого слова смотреть кол-во возращенных результатов и при необходимости делать запрос со следующим словом)

Неактивен

 

#56 17.08.2013 12:01:22

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

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

vasya написал:

1. В вашем запросе таблица категорий не нужна (если запрос вы привели полностью)

Так это вы запрос делали smile

vasya написал:

2. По нескольким словам можно сделать с помощью union и после общий limit. (или после каждого слова смотреть кол-во возращенных результатов и при необходимости делать запрос со следующим словом)

Я просто не умею пока пользоваться union, пока ответа ждал, начал пробовать сам, вот до чего пока дошел, но оно не много не так работает как хотелось бы, оно сортирует слова по алфавиту, а нужно в той последовательности в которой они перечислены в IN().


SELECT image_id, tag FROM tags WHERE tag IN('красивая', 'блондинка', 'зелень') ORDER BY tag DESC LIMIT 3;


Это конечно далеко не то что я хочу получить, но приходится постепенно искать способы для выполнения этой задачи.
Приходится smile Вас вчера не было, а больше не кто в этом вопросе помогать не хочет sad

Отредактированно Debian (17.08.2013 12:19:43)

Неактивен

 

#57 17.08.2013 13:09:50

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

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

Debian написал:

vasya написал:

1. В вашем запросе таблица категорий не нужна (если запрос вы привели полностью)

Так это вы запрос делали smile

Клевета. Найдите "10 отличий" с тем вариантом, что приводил я.

Debian написал:

Я просто не умею пока пользоваться union, пока ответа ждал, начал пробовать сам, вот до чего пока дошел, но оно не много не так работает как хотелось бы, оно сортирует слова по алфавиту, а нужно в той последовательности в которой они перечислены в IN().

SELECT image_id, tag FROM tags WHERE tag IN('красивая', 'блондинка', 'зелень') ORDER BY FIELD (tag, 'красивая', 'блондинка', 'зелень') DESC LIMIT 3;



Debian написал:

Это конечно далеко не то что я хочу получить, но приходится постепенно искать способы для выполнения этой задачи.

Почему не то? Зная нужные imade_id выбираете остальную информацию. Если будете делать одним запросом (добавляя к этому join), то нужно будет зафиксировать порядок объединения с помощью STRAIGHT_JOIN

Debian написал:

Приходится smile Вас вчера не было, а больше не кто в этом вопросе помогать не хочет sad

На форуме мало постоянных пользователей, отвечающих на вопросы, вы можете стать одним из них smile

Неактивен

 

#58 17.08.2013 13:49:59

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

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

Клевета. Найдите "10 отличий" с тем вариантом, что приводил я.

Да, яж сказал, что подправил его немного, вот ваш вариант:

"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"

Вот мой, но уже для другой, но похожей задачи:

SELECT `i`.`id`, `i`.`title`, `i`.`upload_date`
FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag = 'красивая') t JOIN `categories`
ON `i`.`id` = `t`.`image_id` AND `i`.`category_id` = `categories`.`id` AND `i`.`id` != '10'
ORDER BY if(category_id = 5, 1, 2), i.id DESC LIMIT 3;


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

Но я уже понял ваше замечание, спасибо smile Ведь название категории мне в новой задачи не нужно.

Нужно было вам показать наверное вот так:

SELECT `i`.`id`, `i`.`title`, `i`.`upload_date`
FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag = 'красивая') t
ON `i`.`id` = `t`.`image_id` AND `i`.`id` != '10'
ORDER BY if(category_id = 5, 1, 2), i.id DESC LIMIT 3;



SELECT image_id, tag FROM tags WHERE tag IN('красивая', 'блондинка', 'зелень') ORDER BY FIELD (tag, 'красивая', 'блондинка', 'зелень') DESC LIMIT 3;

Про вот это

ORDER BY FIELD (tag, 'красивая', 'блондинка', 'зелень')
я не чего еще пока не знаю, спасибо smile Поищу об этом информацию. Вижу что уже правильно сортируется.

Почему не то? Зная нужные imade_id выбираете остальную информацию. Если будете делать одним запросом (добавляя к этому join), то нужно будет зафиксировать порядок объединения с помощью STRAIGHT_JOIN

Значит я все таки начал думать в верном направлении, я просто решил разбить задачу на несколько отдельных задач, и когда уже найду как решить отдельные части, попытаться все собрать в единый запрос. Вот это STRAIGHT_JOIN я тоже в первые вижу smile

На форуме мало постоянных пользователей, отвечающих на вопросы, вы можете стать одним из них smile

Та ну, куда, на вашем фоне я буду выглядеть полным лошариком smile Мне до вас, еще учиться и учиться, у меня именно по MySQL пока еще слабовато, нужно учить и учить, с HTML, CSS, PHP, регулярными выражениями, серверной частью, железо и программное обеспечение, у меня проблем нет, это я уже довольно хорошо освоил, и обычно в этих вопросах мне помощь не нужна, вот только MySQL, JavaScript нужно подтянуть.

Неактивен

 

#59 17.08.2013 14:10:28

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

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

Нашел, на 370 странице, книги которую начал вчера читать ) а я сейчас на 200 странице smile Это я бы только завтра или после завтра увидел это решение smile

Функцию FIELD() можно использовать для сортировки произвольного множества значений в любом порядке. Например, чтобы вывести записи таблицы driver_log для имен Henry, Suzi и Ben именно в таком порядке, выполните запрос:

mysql> SELECT * FROM driver_log
> ORDER BY FIELD(name,'Henry','Suzi','Ben');
+ + + + +
| rec_id | name | trav_date | miles |
+ + + + +
| 3 | Henry | 2001 11 29 | 300 |
| 4 | Henry | 2001 11 27 | 96 |
| 6 | Henry | 2001 11 26 | 115 |
| 8 | Henry | 2001 12 01 | 197 |
| 10 | Henry | 2001 11 30 | 203 |
| 2 | Suzi | 2001 11 29 | 391 |
| 7 | Suzi | 2001 12 02 | 502 |
| 1 | Ben | 2001 11 30 | 152 |
| 5 | Ben | 2001 11 29 | 131 |
| 9 | Ben | 2001 12 02 | 79 |
+ + + + +


Хорошая книга кстати. Для новичка в MySQL то что нужно smile


Прикрепленные файлы:
Attachment Icon 22.jpg, Размер: 219,630 байт, Скачано: 325

Неактивен

 

#60 17.08.2013 14:28:42

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

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

Только тут нужно еще и как-то по image_id сортировать, потому что вот что выходит:

mysql> SELECT image_id, tag FROM tags WHERE tag IN('красивая', 'блондинка', 'зелень');
+----------+--------------------+
| image_id | tag                |
+----------+--------------------+
|        5 | блондинка          |
|        6 | блондинка          |
|        8 | блондинка          |
|       11 | блондинка          |
|       12 | блондинка          |
|       13 | блондинка          |
|       14 | блондинка          |
|       17 | зелень             |
|       19 | зелень             |
|        3 | красивая           |
|        5 | красивая           |
|        9 | красивая           |
|       10 | красивая           |
|       17 | красивая           |
|       19 | красивая           |
+----------+--------------------+
15 rows in set (0.00 sec)


mysql> SELECT image_id, tag FROM tags WHERE tag IN('красивая', 'блондинка', 'зелень') ORDER BY FIELD (tag, 'красивая', 'блондинка', 'зелень') LIMIT 3;
+----------+------------------+
| image_id | tag              |
+----------+------------------+
|        3 | красивая         |
|        5 | красивая         |
|       19 | красивая         |
+----------+------------------+
3 rows in set (0.00 sec)


Тобишь, мы видим что у нас они идут:

|        3 | красивая           |
|        5 | красивая           |
|        9 | красивая           |
|       10 | красивая           |
|       17 | красивая           |
|       19 | красивая  
 


А он почему то взял:

+----------+------------------+
|        3 | красивая         |
|        5 | красивая         |
|       19 | красивая         |
+----------+------------------+


Как бы выбрал 2 картинки старых, и одну новую, а нужно выводить, либо старые либо новые, в моем случае нужно, от более новых к более старым.

Неактивен

 

#61 17.08.2013 14:42:40

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

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

В этой же книги увидел что можно через запятую указывать ORDER BY. Наверно вот так нужно сделать?

mysql> SELECT image_id, tag FROM tags WHERE tag IN('красивая', 'блондинка', 'зелень') ORDER BY FIELD (tag, 'красивая', 'блондинка', 'зелень'), image_id DESC LIMIT 3;
+----------+------------------+
| image_id | tag              |
+----------+------------------+
|       19 | красивая         |
|       17 | красивая         |
|       10 | красивая         |
+----------+------------------+
3 rows in set (0.00 sec)
 

Неактивен

 

#62 17.08.2013 15:11:29

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

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

Итого получается у нас вот как-то так:

mysql> SELECT image_id, tag FROM tags WHERE tag IN('зелень', 'блондинка', 'красивая') ORDER BY FIELD (tag, 'зелень', 'блондинка', 'красивая'), image_id DESC LIMIT 3;
+----------+--------------------+
| image_id | tag                |
+----------+--------------------+
|       19 | зелень             |
|       17 | зелень             |
|       14 | блондинка          |
+----------+--------------------+
3 rows in set (0.00 sec)

mysql> SELECT `images`.`id`, `images`.`title`, `images`.`upload_date` FROM images WHERE id IN(19, 17, 14) ORDER BY FIELD (id, 19, 17, 14)\G
*************************** 1. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 2. row ***************************
         id: 17
      title: Красивые розовые цветы.
upload_date: 1376564289
*************************** 3. row ***************************
         id: 14
      title: Девушка в очень сексуальном белье, сидит на полу возле старинного резного кресла.
upload_date: 1376563406
3 rows in set (0.00 sec)


Это в два запроса. И без учета категории. Теперь нужно еще все это как-то объединить, и с учетом категорий smile При этом в результат нужно получить только эти поля `images`.`id`, `images`.`title`, `images`.`upload_date`

Отредактированно Debian (17.08.2013 15:13:11)

Неактивен

 

#63 17.08.2013 15:48:05

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

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

Ох я тут и на мудрил smile Не знаю вроде работает, но я сомневаюсь, что я это сделал правильно, и еще не тестировал, на паре примеров сработало правильно.

Тоесть я получил нужные поля из таблицы images, при этом исключил из выборки, картинку с номером 19, потому, что именно по ее ключевым словам, ищутся похожие картинки, также указал, что они должны все иметь id категории 6, ну и отсортированы в обратном порядке. smile Посмотрите пожалуйста, мне кажется, что тут, что-то точно не так smile Первый раз в жизни составляю такой сложный и большой запрос smile

SELECT DISTINCT `i`.`id`, `i`.`title`, `i`.`upload_date` FROM images i JOIN (SELECT image_id, tag FROM tags WHERE tag IN('цветы', 'блондинка', 'красивая') ORDER BY FIELD (tag, 'цветы', 'блондинка', 'красивая'), image_id DESC) t ON i.id = t.image_id AND i.category_id = 6 AND i.id != 19 ORDER BY i.id DESC LIMIT 3;

Отредактированно Debian (17.08.2013 15:58:38)

Неактивен

 

#64 17.08.2013 16:26:39

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

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

Немного переделал, так будет логичнее:

SELECT DISTINCT i.id, i.title, i.upload_date FROM images i JOIN (SELECT image_id, tag FROM tags WHERE image_id != 19 AND tag IN('желтые', 'цветы', 'красивая', 'зелень') ORDER BY FIELD (tag, 'желтые', 'цветы', 'красивая', 'зелень'), image_id DESC) t ON i.id = t.image_id AND i.category_id = 6 ORDER BY i.id DESC LIMIT 3;


Что скажите? Может как-то можно это сделать лучше?

Неактивен

 

#65 17.08.2013 16:49:02

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

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

Все таки немного некорректно он работает, вот, посмотрите.

mysql> SELECT DISTINCT i.id, i.title, i.upload_date FROM images i JOIN (SELECT image_id, tag FROM tags WHERE image_id != 19 AND tag IN('желтые', 'цветы', 'красивая', 'зелень') ORDER BY FIELD (tag, 'желтые', 'цветы', 'красивая', 'зелень'), image_id DESC) t ON i.id = t.image_id AND i.category_id = 6 ORDER BY i.id DESC LIMIT 3\G
*************************** 1. row ***************************
         id: 18
      title: Очень необычный свадебный букет цветов, с двумя колечками.
upload_date: 1376564364
*************************** 2. row ***************************
         id: 17
      title: Красивые розовые цветы.
upload_date: 1376564289
*************************** 3. row ***************************
         id: 16
      title: Шикарный букет цветов, белые и синие лепестки.
upload_date: 1376564167
3 rows in set (0.01 sec)

mysql> SELECT image_id, tag FROM tags WHERE image_id != 19 AND tag IN('желтые', 'цветы', 'красивая', 'зелень') ORDER BY FIELD (tag, 'желтые', 'цветы', 'красивая', 'зелень'), image_id DESC;
+----------+------------------+
| image_id | tag              |
+----------+------------------+
|       18 | цветы            |
|       16 | цветы            |
|       17 | красивая         |
|       10 | красивая         |
|        9 | красивая         |
|        5 | красивая         |
|        3 | красивая         |
|       17 | зелень           |
+----------+------------------+
8 rows in set (0.00 sec)


Тоесть, он должен был вывести в таком порядке 18, 16, 17, а он картинки выводит как 18, 17, 16, немного не пойму как правильно отсортировать. Тоесть, во временной таблице (внутреннем запросе) он правильно все отсортировал, а основной запрос уже выводит иначе sad

Отредактированно Debian (17.08.2013 16:53:33)

Неактивен

 

#66 17.08.2013 17:44:15

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

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

Может быть вот так? Вроде работает, но правильная ли реализация?

SELECT DISTINCT i.id, i.title, i.upload_date FROM images i JOIN (SELECT image_id, tag FROM tags WHERE image_id != 19 AND tag IN('желтые', 'цветы', 'красивая', 'зелень') ORDER BY FIELD (tag, 'желтые', 'цветы', 'красивая', 'зелень'), image_id DESC) t ON i.id = t.image_id AND i.category_id = 6 ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень'), i.id DESC LIMIT 3;



mysql> SELECT image_id, tag FROM tags WHERE image_id != 19 AND tag IN('желтые', 'цветы', 'красивая', 'зелень') ORDER BY FIELD (tag, 'желтые', 'цветы', 'красивая', 'зелень'), image_id DESC\G
*************************** 1. row ***************************
image_id: 18
     tag: цветы
*************************** 2. row ***************************
image_id: 16
     tag: цветы
*************************** 3. row ***************************
image_id: 17
     tag: красивая
*************************** 4. row ***************************
image_id: 10
     tag: красивая
*************************** 5. row ***************************
image_id: 9
     tag: красивая
*************************** 6. row ***************************
image_id: 5
     tag: красивая
*************************** 7. row ***************************
image_id: 3
     tag: красивая
*************************** 8. row ***************************
image_id: 17
     tag: зелень
8 rows in set (0.00 sec)

mysql> SELECT DISTINCT i.id, i.title, i.upload_date FROM images i JOIN (SELECT image_id, tag FROM tags WHERE image_id != 19 AND tag IN('желтые', 'цветы', 'красивая', 'зелень') ORDER BY FIELD (tag, 'желтые', 'цветы', 'красивая', 'зелень'), image_id DESC) t ON i.id = t.image_id AND i.category_id = 6 ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень'), i.id DESC LIMIT 3\G
*************************** 1. row ***************************
         id: 18
      title: Очень необычный свадебный букет цветов, с двумя колечками.
upload_date: 1376564364
*************************** 2. row ***************************
         id: 16
      title: Шикарный букет цветов, белые и синие лепестки.
upload_date: 1376564167
*************************** 3. row ***************************
         id: 17
      title: Красивые розовые цветы.
upload_date: 1376564289
3 rows in set (0.00 sec)

Отредактированно Debian (17.08.2013 17:52:17)

Неактивен

 

#67 17.08.2013 20:29:32

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

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

Еще немного улучшил, точнее упростил:

SELECT DISTINCT i.id, i.title, i.upload_date FROM images i JOIN (SELECT image_id, tag FROM tags WHERE image_id != 19 AND tag IN('желтые', 'цветы', 'красивая', 'зелень')) t ON i.id = t.image_id AND i.category_id = 6 ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень'), i.id DESC LIMIT 3;


Получается, что я дважды сортировку делал smile

Неактивен

 

#68 17.08.2013 22:32:02

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

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

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

2. Зачем в подзапросе выбирать поле tag?

3. Сортировку лучше в подзапрос. Тогда сортироваться будут строки меньшей длинны (только image_id вместо i.id, i.title, i.upload_date). В этом случае вместо join нужен straight_join, который объединяет таблицы в том порядке как они указаны в запросе (естественно, что таблицу images и подзапрос нужно поменять местами).

Неактивен

 

#69 17.08.2013 23:12:43

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

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

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

Вы правы, исправил.

2. Зачем в подзапросе выбирать поле tag?

Тогда не будет работать вот эта часть, ведь в подзапросе не будет данных.

ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень').

Но если переписать как вы предлагаете в пункте номер 3, то наверно и не нужно smile

3. Сортировку лучше в подзапрос. Тогда сортироваться будут строки меньшей длинны (только image_id вместо i.id, i.title, i.upload_date). В этом случае вместо join нужен straight_join, который объединяет таблицы в том порядке как они указаны в запросе (естественно, что таблицу images и подзапрос нужно поменять местами).

А можете переписать запрос, так как это сделали бы вы? Пожалуйста! smile

SELECT i.id, i.title, i.upload_date FROM images i
JOIN (SELECT DISTINCT image_id, tag FROM tags WHERE image_id != 19 AND tag IN('желтые', 'цветы', 'красивая', 'зелень')) t
ON i.id = t.image_id AND i.category_id = 6
ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень'), i.id DESC LIMIT 3;


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

Неактивен

 

#70 18.08.2013 00:00:43

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

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

Странно, но DISTINCT, в подзапросе не работает sad Смотрите сами! Может я конечно чего-то не понял, но факт.

mysql> SELECT i.id, i.title, i.upload_date FROM images i
    -> JOIN (SELECT image_id, tag FROM tags WHERE tag IN('желтые', 'цветы', 'красивая', 'зелень')) t
    -> ON i.id = t.image_id
    -> ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень'), i.id DESC\G
*************************** 1. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 2. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 3. row ***************************
         id: 18
      title: Очень необычный свадебный букет цветов, с двумя колечками.
upload_date: 1376564364
*************************** 4. row ***************************
         id: 16
      title: Шикарный букет цветов, белые и синие лепестки.
upload_date: 1376564167
*************************** 5. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 6. row ***************************
         id: 17
      title: Красивые розовые цветы.
upload_date: 1376564289
*************************** 7. row ***************************
         id: 10
      title: Сексуальная брюнетка, на красивой кровати.
upload_date: 1376562993
*************************** 8. row ***************************
         id: 9
      title: Девушка в красивом белье, стоит у окна.
upload_date: 1376562939
*************************** 9. row ***************************
         id: 5
      title: Красивая блондинка, лежит на столе, в красном платье.
upload_date: 1376562539
*************************** 10. row ***************************
         id: 3
      title: Сексуальная брюнетка возле бассейна.
upload_date: 1376557061
*************************** 11. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 12. row ***************************
         id: 17
      title: Красивые розовые цветы.
upload_date: 1376564289
12 rows in set (0.00 sec)

mysql> SELECT i.id, i.title, i.upload_date FROM images i
    -> JOIN (SELECT DISTINCT image_id, tag FROM tags WHERE tag IN('желтые', 'цветы', 'красивая', 'зелень')) t
    -> ON i.id = t.image_id
    -> ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень'), i.id DESC\G
*************************** 1. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 2. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 3. row ***************************
         id: 18
      title: Очень необычный свадебный букет цветов, с двумя колечками.
upload_date: 1376564364
*************************** 4. row ***************************
         id: 16
      title: Шикарный букет цветов, белые и синие лепестки.
upload_date: 1376564167
*************************** 5. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 6. row ***************************
         id: 17
      title: Красивые розовые цветы.
upload_date: 1376564289
*************************** 7. row ***************************
         id: 10
      title: Сексуальная брюнетка, на красивой кровати.
upload_date: 1376562993
*************************** 8. row ***************************
         id: 9
      title: Девушка в красивом белье, стоит у окна.
upload_date: 1376562939
*************************** 9. row ***************************
         id: 5
      title: Красивая блондинка, лежит на столе, в красном платье.
upload_date: 1376562539
*************************** 10. row ***************************
         id: 3
      title: Сексуальная брюнетка возле бассейна.
upload_date: 1376557061
*************************** 11. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 12. row ***************************
         id: 17
      title: Красивые розовые цветы.
upload_date: 1376564289
12 rows in set (0.00 sec)

mysql> SELECT DISTINCT i.id, i.title, i.upload_date FROM images i
    -> JOIN (SELECT image_id, tag FROM tags WHERE tag IN('желтые', 'цветы', 'красивая', 'зелень')) t
    -> ON i.id = t.image_id
    -> ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень'), i.id DESC\G
*************************** 1. row ***************************
         id: 19
      title: Интересные, очень красивые желтые цветы.
upload_date: 1376564413
*************************** 2. row ***************************
         id: 18
      title: Очень необычный свадебный букет цветов, с двумя колечками.
upload_date: 1376564364
*************************** 3. row ***************************
         id: 16
      title: Шикарный букет цветов, белые и синие лепестки.
upload_date: 1376564167
*************************** 4. row ***************************
         id: 10
      title: Сексуальная брюнетка, на красивой кровати.
upload_date: 1376562993
*************************** 5. row ***************************
         id: 9
      title: Девушка в красивом белье, стоит у окна.
upload_date: 1376562939
*************************** 6. row ***************************
         id: 5
      title: Красивая блондинка, лежит на столе, в красном платье.
upload_date: 1376562539
*************************** 7. row ***************************
         id: 3
      title: Сексуальная брюнетка возле бассейна.
upload_date: 1376557061
*************************** 8. row ***************************
         id: 17
      title: Красивые розовые цветы.
upload_date: 1376564289
8 rows in set (0.00 sec)

Неактивен

 

#71 18.08.2013 00:05:18

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

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

SELECT i.id, i.title, i.upload_date FROM (SELECT DISTINCT image_id FROM tags WHERE image_id != 19 AND category_id = 6 AND tag IN('желтые', 'цветы', 'красивая', 'зелень') ORDER BY FIELD (tag, 'желтые', 'цветы', 'красивая', 'зелень'), image_id DESC LIMIT 3) t STRAIGHT_JOIN images i ON i.id = t.image_id; -- обратите внимание, что категория в этом случае должна быть продублирована к таблице тегов

Неактивен

 

#72 18.08.2013 00:08:44

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

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

Debian написал:

Странно, но DISTINCT, в подзапросе не работает sad Смотрите сами! Может я конечно чего-то не понял, но факт.

distinct - это аналог group by по всем выбираемым полям.

Неактивен

 

#73 18.08.2013 00:16:47

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

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

-- обратите внимание, что категория в этом случае должна быть продублирована к таблице тегов

Не понял!?

Неактивен

 

#74 18.08.2013 00:20:00

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

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

Если проверку на категорию делать после объединения, а ограничение на кол-во в подзапросе, то возможен вариант, что часть или все image_id выбранные в подхапросе относятся к другим категориям.

Неактивен

 

#75 18.08.2013 00:21:00

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

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

Как-то странно у вас ограничение category_id стоит, сложненький для моего понимания запрос, нужно еще читать и читать, и запрос не закончен или что я не пойму? Просто он не работает, и как раз в том месте где мне и не понятно, от куда в таблице tags, взялся category_id. Чего-то я не до понял.

mysql> SELECT i.id, i.title, i.upload_date FROM (SELECT DISTINCT image_id FROM tags WHERE image_id != 19 AND category_id = 6 AND tag IN('желтые', 'цветы', 'красивая', 'зелень') ORDER BY FIELD (tag, 'желтые', 'цветы', 'красивая', 'зелень'), image_id DESC LIMIT 3) t STRAIGHT_JOIN images i ON i.id = t.image_id;
ERROR 1054 (42S22): Unknown column 'category_id' in 'where clause'

Неактивен

 

Board footer

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