Реализация твитов MySQL и запросов - PullRequest
0 голосов
/ 07 февраля 2020

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

CREATE TABLE IF NOT EXISTS `User` (
    `user_id` INT AUTO_INCREMENT PRIMARY KEY,
    `username` varchar(40)  NOT NULL ,
    `pswd` varchar(255) NOT NULL,,
    `email` varchar(255) NOT NULL  ,
    `first_name` varchar(40)  NOT NULL ,
    `last_name` varchar(40)  NOT NULL,
    CONSTRAINT uc_username_email UNIQUE (username , email)
);

-- Using a middle table for users to follow others on a many-to-many base
CREATE TABLE Following (
  follower_id INT(6) NOT NULL,
  following_id INT(6) NOT NULL,
  KEY (`follower_id`),
  KEY (`following_id`)
) 


CREATE TABLE IF NOT EXISTS `Tweet` (
    `tweet_id` INT AUTO_INCREMENT PRIMARY KEY,
    `text` varchar(280)  NOT NULL ,
    --  I chose varchar vs TEXT as the latter is not stored in the database server’s memory.
    -- By querying text data MySQL has to read from it from the disk, much slower in comparison with VARCHAR.
    `publication_date` DATETIME NOT NULL,,
    `username` varchar(40),
    FOREIGN KEY (`username`) REFERENCES `user`(`username`)
                      ON DELETE CASCADE
);

Допустим, я хочу написать запрос, который возвращает 10 последних твитов пользователей, за которыми следует пользователь с именем пользователя "Том". Каков наилучший способ записать этот запрос и вернуть результаты с именем пользователя, именем, фамилией, текстом и датой публикации.

Также, если через минуту я захочу снова запросить 10 последних твитов и предположить, что Том следует твиты в течение этой минуты, как я могу запросить базу данных, чтобы не выбирать твиты, которые уже были показаны в первом запросе?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Чтобы ответить на ваш первый вопрос:

SELECT u1.username, u1.first_name, u1.last_name, t.text, t.publication_date
FROM Tweet t
JOIN User u1 ON t.username = u1.username
JOIN Following f ON f.following_id = u1.user_id
JOIN User u2 ON u2.user_id = f.follower_id
WHERE u2.username = 'Tom'
ORDER BY t.publication_date DESC
LIMIT 10

Для второй части просто возьмите tweet_id из первой строки первого запроса (поэтому самое последнее значение tweet_id) и используйте его в предложение WHERE для следующего запроса, т.е.

WHERE u2.username = 'Tom'
  AND t.tweet_id > <value from previous query>
0 голосов
/ 07 февраля 2020

Чтобы получить последние 10 твитов для Tom:

select flg.username, flg.first_name, flg.last_name, t.tweet_id, t.text, t.publication_date
from user flr
inner join following f on f.follower_id = flr.user_id
inner join user flg on flg.user_id = f.following_id
inner join tweet t on t.username = flg.username
where flr.username = 'Tom'
order by tweet_id desc
limit 10

Чтобы получить следующие 10 твитов, передайте максимальное значение tweet_id и примените дополнительное условие в предложении where:

where flr.username = 'Tom'
and t.tweet_id > <previous_max_tweet_id>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...