делаю выборку 5ти случайных статей в цикле do-while из базы из таблицы articles, где в число в колонке cat соответствует id в таблице cat_articles. Необходимо при выборке статей из базы вытащить title из таблицы cat, который соответствует каждой статье. В цикле выборку из cat_articles сделать не получится, т.к. создастся 5 одинаковых переменных. Как мне поступить?
Код (Text): CREATE TABLE cat_articles ( cat_id SERIAL PRIMARY KEY, title VARCHAR(20) ); CREATE TABLE articles ( id SERIAL PRIMARY KEY, cat_id BIGINT NOT NULL, context TEXT, FOREIGN KEY(cat_id) REFERENCES cat_articles(cat_id) ); INSERT INTO cat_articles VALUES(NULL,"test1"), (NULL,"test2"), (NULL,"test3"); INSERT INTO articles VALUES(NULL,1,"hello1"), (NULL,2,"hello2"), (NULL,3,"hello3"); Запрос для цикла: Код (Text): SET @rand = (SELECT FLOOR(RAND()*(SELECT COUNT(*) FROM articles))); SET @sql = CONCAT('SELECT a.*, r.title FROM articles as a JOIN cat_articles as r USING (cat_id) LIMIT 1 OFFSET ', @rand); PREPARE STATMENT FROM @sql; EXECUTE STATMENT; Результат(рандомный): Код (Text): id cat_id context title 3 3 hello3 test3 Добавлено спустя 1 минут 0 секунд: Другой вариант Код (Text): SELECT a.*, r.title FROM articles a JOIN (SELECT CEIL(RAND() * (SELECT MAX(id) FROM articles)) rand_id) b ON (a.id = rand_id) JOIN cat_articles as r USING(cat_id) Добавлено спустя 2 минут 0 секунды: Ну и еще один вариант Код (Text): SELECT a.*, r.title FROM articles a JOIN cat_articles r USING(cat_id) JOIN (SELECT CEIL(RAND() * (SELECT MAX(id) FROM articles)) rand_id) b WHERE a.id >= b.rand_id ORDER BY b.rand_id LIMIT 1