SQL запрос для получения сообщений пользователя - PullRequest
0 голосов
/ 07 января 2012

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

У меня есть таблица, которая показывает связь между двумя пользователями.Между двумя пользователями может быть 5 типов связи:

  • друзья;
  • родственники;
  • коллега;
  • одноклассник;
  • знакомства.

Любые два пользователя могут быть связаны более чем в одной взаимосвязи, поэтому в таблице 7 столбцов, а именно:

first_user_id (int)
second_user_id (int)
friends (bool)
relative (bool)
colleague (bool)
classmate (bool)
acquaintance (bool)

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

  • Shared - все общие элементы:

    • id (int auto_incr p_key);

    • type (text) - тип поста, который находится в этом ряду, например.это может быть 'thought', или 'photo', или 'video'.на данный момент это будет 'thought';

    • item_id (int) - id элемента, который нужно искать в соответствующей таблице, на данный момент это таблица thought;

    • shared_by (int) - id пользователя, который поделился этим элементом

    • time (datetime) - дата / время, когда была опубликована мысль

  • Thought - это таблица для хранения всех элементов мышления, будут отдельные таблицы для хранения каждого типа элемента, например, photo,video и т. Д.:

    • id (int auto_incr p_key)

    • content (text) - содержание мысли

  • Shared_with:

    • post_id (int p_key) - здесь будет вставлено id значение таблицы shared

    • public (bool) - если это значение равно true, это общедоступная запись и может быть доступно всем

    • friends (bool) - если true, эта запись можетподелиться с людьми, которые дружат с тем, кто его опубликовал

    • relative (bool) - то же, что и above для родственников

    • colleague (bool) - то же самое для коллег

    • classmates(bool) - то же самое для одноклассников

    • acquaintance (bool) - то же самое для знакомства

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

1 Ответ

0 голосов
/ 07 января 2012

Сначала несколько советов по схеме - измените таблицу соединений:

 UserId0
 UserId1
 RelationshipId

Создать таблицу поиска с помощью

 RelationshipId
 Description

Второй - изменить таблицу shared_with на:

 PostId
 Public
 SharedWith (this should be a bitmask for the various types of relationships for this post)

Другая справочная таблица:

 SharedWithMask (1,2,4,etc)
 SharedWithDescription

Третье - изменить TypeOf в «shared» на число. Поиск текста может быть ограничением и болью.

В вашем вопросе вы не упомянули, что значит быть "топ-20", поэтому мы пойдем с 20 самыми последними.

 select itemid from shared join connections on
 shared.shared_by = connections.second_user_id join shared_with on
 shared_with.post_id = shared.id where
 connections.first_user_id = (person) and shared_with.public = true
 order by shared.datetime limit 20;

Это отправная точка.

...