За последние 24 часа нас посетили 34217 программистов и 1692 робота. Сейчас ищут 676 программистов ...

Проблема с выборкой из базы

Тема в разделе "PHP для новичков", создана пользователем zevilz, 15 мар 2012.

  1. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    делаю выборку 5ти случайных статей в цикле do-while из базы из таблицы articles, где в число в колонке cat соответствует id в таблице cat_articles. Необходимо при выборке статей из базы вытащить title из таблицы cat, который соответствует каждой статье. В цикле выборку из cat_articles сделать не получится, т.к. создастся 5 одинаковых переменных. Как мне поступить?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    покажи запрос =)
     
  3. AndreJM

    AndreJM Активный пользователь

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