За последние 24 часа нас посетили 20119 программистов и 1693 робота. Сейчас ищет 1851 программист ...

DISTINCT и RAND

Тема в разделе "MySQL", создана пользователем oranze123, 24 авг 2008.

  1. oranze123

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

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    Доброго времяни суток.
    Столкнулся с проблемой, есть запрос:
    [sql] $sql_result = $db->query("SELECT DISTINCT(users_table.id) AS user_id,
    Name, Surename, nastroenie, Nick, City, Country, Sex, LastTime, DOB, Default_Photo,
    friends_table.first,
    friends_table.second, friends_table.type
    FROM friends_table, users_table
    WHERE users_table.id<>'$id'
    ORDER BY RAND() DESC LIMIT 0, 20;");[/sql]

    Все бы в нем вообшемто хорошо, НО test__community_users_table.id повторяются в результатах. Задача стояла следующая: 1) Случайная выборка 2) Уникальные (без повторений)

    Еще замеченны тормоза на базе свыше 100 000 - по всей вероятности RAND хомит.

    Может кто-нибудь сталкивался?

    Заранее спасибо за помощь и мысли
     
  2. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
  3. oranze123

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

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    Ну я это уже заметил, но проблемма с выборкой остается. Есть ли другой способ "случайного" извлечения по id с автоинкрементом, да еще и не всегда целым - некоторые записи могут быть удалены
     
  4. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
  5. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Luge
    [sql]SELECT name
    FROM random JOIN
    (SELECT CEIL(RAND() *
    (SELECT MAX(id)
    FROM random)) AS id
    ) AS r2
    USING (id);[/sql]
    У нас с автором разные понятия о совершенстве ;)
     
  6. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    oranze123
    Если удаленных записей немного относительно общего количества, то вот хороший метод:
    1. Берем MAX(id)
    2. Программно генерируем набор из N случайных чисел от 1 до MAX
    3. Делаем SELECT * FROM table WHERE id IN (набор)
    4. Если вернулось N записей - все отлично, иначе возвращаемся к шагу 2
     
  7. oranze123

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

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    Нечто подобное сам тоже придумал.
     
  8. oranze123

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

    С нами с:
    13 июл 2007
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Latvia, Liepaja
    А вот за такую мысль спасибо!!!! Не видел просто никогда в работе таких запросов - чтоже, очевидно настала пора :roll: :wink: