sql запрос “лента новостей”

292
03 апреля 2017, 08:31

Доброго времени суток. Помогите сформировать sql запрос так называемой "ленты новостей" тоесть выводить только записи своих друзей.

таблица друзей frends - id | user | frend таблица новостей lenta - id | user | text | time

frends     id | user | frend
        1    nik   nik2   
        2    nik   nik3   
        3    nik3  nik2
        4    nik4  nik2
lenta      id |  user | text | time
        1    nik3   text1
        2    nik2   text2 
        3    nik4   text3
        4    nik2   text4
        5    nik4   text5 
        6    nik3   text6

нужно что бы выводились записи только пользователей nik2 и nik3, так как они мои друзья. Вроде этого - text1, text2, text4, text6

Answer 1
select `text`
from lenta
where `user` in (select friend from friends where `user` = 'nik')
Answer 2
SELECT DISTINCT `lenta`.`text` 
FROM `lenta`
JOIN `frends`
ON `lenta`.`user` = `frends`.`frend`;

Добавил "DISTINCT", исключающий повторы строк в выборке.

Answer 3

Для небольших таблиц отлично будут работать варианты, которые представлены выше, но обычно такие таблицы редко остаются небольшими. При сколько-нибудь большом количестве данных база данных с такой архитектурой ляжет. Поэтому вот мой совет:

  1. Переведите поля user и friend в целочисленные (INT). Так поиск будет происходить намного быстрее. Выставите простой индекс на поле user в первой таблице и и составной (user, time) на второй.
  2. Лучше не использовать запросы с джоинами, если предполагаете большой объем данных, связанность данных не позволит хорошо масштабировать систему. Что касается самого запроса, то его лучше разбить на 2 (в первом мы просто узнает весь список friend_id пользователя, а во втором вставляем в условие WHERE этот список).

Почему именно такой совет, а не через JOIN? Допустим, у Вас 10 тыс. активных пользователей, у каждого условно по 100 друзей, итого 1 млн. записей в первой таблице. Без перевода в INT она уже будет тормозить или вообще ляжет. Далее вторая таблица, допустим раз в неделю каждый активный пользователь публикует 2-3 записи, итого за год будет 1-1.5 млн. записей, по каждой из которых надо проводить проверку. Уже на таком объеме указанные выше запросы работать не будут. И это ни разу даже близко не High Load.

READ ALSO
html 5 и тег audio (1 плеер и треки на странице)

html 5 и тег audio (1 плеер и треки на странице)

Хочу сделать 1 плеер сверху страницы и ниже будут MP3 файлы с ссылками на нихНужно сделать так, чтобы при нажатии кнопки рядом с ссылками, ссылка...

311
не могу сделать авторизацию с яндекс диском

не могу сделать авторизацию с яндекс диском

есть код пишет не авторизован

545
Таймаут очереди сообщений php

Таймаут очереди сообщений php

Хотелось бы реализовать общение между двумя процессами на сервере через средства php для реализации long-poolingДля этой цели php был собран с ключами...

335
обработать json данные

обработать json данные

получаю ответ от api яндекс диска но дальше проблема не могу преобразовать json такой ответ имею

269