Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте! Не знаю в правильную ли я тему пишу. Так что если что-то не туда то извините.
Помогите пожалуйста решить задачку, я не очень хорошо владею MySQL, но учусь )
Задача такая: Нужно в таблице подсчитать количество, одинаковых тегов.
Подробнее: Есть у нас id изображения, у которого в отдельной табличке хранятся теги, с помощью id мы сначала получаем все теги относящиеся к этой картинке, а потом нужно подсчитать, сколько в таблице еще таких же тегов.
Что бы в итоге получилось вот так:
автомобиль (52), красный (42), BMW (12), дорога (9), мокрая (0)
Я эту задачку решил вот так:
Вот структура таблички:
Неактивен
Предлагаю отделить php от sql.
Вообще говоря, Вы можете получить количество различных вариаций тегов на таблицу следующим образом:
SELECT `tag`, count(*) FROM `tags` GROUP BY `tag`;
Если хотите не на всю таблицу, а на конкретную картинку, то
SELECT `tag`, count(*) FROM `tags` WHERE image_id=АЙДИ_НУЖНОЙ_КАРТИНКИ GROUP BY `tag`;
Неактивен
Таким образом получается вот что:
Отредактированно Debian (14.08.2013 21:37:45)
Неактивен
Приведите простейший набор тестовых данных, то есть содержимое таблицы tags и чего Вы хотите получить оттуда. Без этого сложновато понять, что Вы хотите .
Неактивен
Постараюсь подробнее объяснить.
Смотрите есть табличка в которой хранится вся информация об изображении, кроме тегов, теги вынесены в отдельную табличку, как раз с целью оптимизации, и что бы все это быстрее и легче работало.
В табличку tags мы заносим теги, которые туда заносятся в момент загрузки картинки.
Тоесть, пользователь загружает картинку, указывает заголовок, ключевые слова, категорию и т.д, мы все это дело пишем в табличку images, кроме ключевых слов, их мы пишем в табличку tags, а пишем вот так:
Допустим пользователь при загрузке, указал такие слова: машинка, красивая, дорога, мост, речка в табличку они будут писаться вот в таком виде:
Отредактированно Debian (14.08.2013 21:59:25)
Неактивен
Вот еще на всякий случай, как сейчас выглядит таблица tags, там просто мало, я несколько картинок для теста загрузил, с девушками .
Неактивен
Вот этот запрос возвратит тэг и количество их в таблице - только тех тегов, которые указаны для image №2:
Неактивен
Это что-то не то, вот что вернуло.
Неактивен
Там и слово блондинка то всего 4 раза повторяется, как вы сами можете подсчитать в таблице выше. От куда он насчитал 16? Что это он вообще посчитал не понятно И почему он вообще вернул слово блондинка, ведь об этом не где в запросе нет упоминаний )
Отредактированно Debian (14.08.2013 22:29:17)
Неактивен
Да, я недописал немного запрос (по хорошему он вообще не должен был выполниться, это уже тонкие особенности дельфина ).
SELECT `tag`,count(*) FROM `tags` WHERE `tag` IN ( SELECT `tag` FROM `tags` WHERE `image_id` = 2 ) GROUP BY `tag`;
Неактивен
Во вот это я понимаю супер, пупер запрос Ураааааа, спасибочки вам огроменное, вот это я понимаю форум. Я даже не сомневался что тут мне профессионально помогут. Рад что нашел ваш форум, буду постояльцем Я просто предварительно почитал тут у вас несколько тем и понял что лучше чем тут профи не где нет, странно что ваш форум такой не популярный, он должен в поисковиках быть на первом месте по запросу MySQL и т.д. Вот не справедливо ) Еще раз спасибочки Тему если можно пока не закрывайте, я просто еще сейчас или уже завтра буду с этим работать, может еще вопрос по этой теме будет. Класс Не могу нарадоваться!
Неактивен
Спасибо на добром слове, обращайтесь . А поисковик по запросу mysql на первом месте выдаёт mysql.com, но это как бе логично.
Неактивен
Нет, просто я по MySQL уже давно ищу всякую информацию, в процессе обучения, всех web технологий, а это уже как бы не один год, и наткнулся на ваш сайт только вчера. Я вот о чем, что на такой классный сайт хотелось бы попасть сразу, много бы головной боли лишился. И быстрее чему-то научился Еще раз огромное спасибо за ваш труд.
Неактивен
Вот что в итоге возвращает. Просто шикарно
Отредактированно Debian (14.08.2013 23:05:39)
Неактивен
А нет ли у MySQL такой возможности чтобы он возвращал поле count(*) с другим именем, ну например num? Это конечно не столь важно просто интересно в целях обучения, ну и так было бы в коде более удобно обращаться к данным.
Неактивен
Да, есть. таблицы тоже можно "переименовывать" в запросе.
SELECT count(t.*) as num FROM tabl AS t WHERE...;
Неактивен
Супер Я про AS читал, но думал что он делает псевдонимы к которым можно обращаться только в запросе, но не думал что он и в результат вернет псевдоним. Дополнил ваш запросик. Вроде правильно?
Неактивен
Как видим, правильно - колонка ведь num теперь называется, а не count(*).
Неактивен
Еще вопросик возник, он их выводит вот так:
Неактивен
Тот порядок, в котором они в базе нам (если исходить из стандарта ANSI SQL) неведом и мы не должны делать никаких предположений об этом. Но мы можем получать данные в том порядке, который нужен нам.
SELECT * FROM `tags` WHERE `image_id` = 2 ORDER BY id ASC;
SELECT * FROM `tags` WHERE `image_id` = 2 ORDER BY image_id DESC;
SELECT * FROM `tags` WHERE `image_id` = 2 ORDER BY id ASC, image_id DESC;
Неактивен
Я просто про ORDER BY знаю, но попробовал его впихнуть в ваш запрос, а оно не то.
Неактивен
Вы пытаетесь сортировать по id, а такой колонки ведь нету в выборке итоговой.
Эту выборку можно отсортировать либо по tag либо по count.
Неактивен
Тогда выходит что не получится? Нужно как раз по id сортировать. Что бы они вывелись в том порядке, как их вписывал пользователь. Это как бы не критично но желательно.
Неактивен
1. Подзапрос в части in лучше всегда переписывать через join (для производительности).
2. Для сортировки по id это необходимо.
Неактивен
Супер Большое спасибо Ребят а мне нужна еще помощь, тоже нужно составить правильный запрос, теперь нужно, делать поиск картинок, по этим ключевым словам Продолжить эту тему, или создать новую?
Неактивен