Ответы пользователя по тегу SQL
  • Как оптимизировать запрос получения рекомендуемых постов с одним из тех же тегов?

    jemunjho
    @jemunjho
    Несколько вопросов:
    1) Теги могут дублироваться? Или они уникальные?

    2) Один и тот же тег - может быть привязан к разным постам. Так ведь?
    Можно попробовать сделать следующее: разбить все на три таблицы:
    - posts: id / site_id / published_at
    - tags: id / name [и можно поставить еще ключ уникальности на поле name]
    - post_tag_binding: post_id / tag_id [и поставить уникальный составной ключ на post_id + tag_id]

    3) Тогда запрос, приблизительно, будет выглядеть вот как-то так:
    select
    	p.id
    from posts as p, post_tag_binding as p_t_b
    where p.site_id = 124 and 
          p.id != 123 and 
          p.id = p_t_b.post_id and 
          p_t_b.tag_id in (
          	select 
          		p_t_b2.tag_id
          	from post_tag_binding as p_t_b2
          	where p_t_b2.post_id = 123
          )

    4) Один и тот же пост - может быть привязан к разным сайтам? Если да, то нужно сделать еще одну таблицу: post_site_binding, в которой будут содержаться поля - post_id / site_id. Это немного усложнит выборку, но не значительно. И так же - можно будет сделать уникальный ключ по двум этим полям.

    Я бы предложил следующую структуру:
    - posts: id / title / description / created_at и т.д.
    - tags: id / name [и можно поставить еще ключ уникальности на поле name]
    - sites: id / name [и можно поставить еще ключ уникальности на поле name]
    - post_tag_binding: post_id / tag_id [и поставить уникальный составной ключ на post_id + tag_id; дополнительно - сюда можно будет добавить еще site_id, если предполагается, что на разных сайтах может быть разный набор тегов для одного и того же поста]
    - post_feed: post_id / site_id / published_at [т.е. делаем еще одну таблицу, в которой будем хранить - даты, когда и на какой сайт данный пост был опубликован]
    Ответ написан
  • Как составить запрос?

    jemunjho
    @jemunjho
    SELECT
    	*
    FROM `Quests` AS q1
    WHERE q1.`id` NOT IN (
    	SELECT 
    		`questId`
    	FROM `QuestActive` AS q2
    	WHERE q2.`userid` IN (перечисление IDшников)
    )
    Ответ написан