Mysql
 sql >> база данни >  >> RDS >> Mysql

изберете 1 произволен ред със сложно филтриране

Имам две решения на проблема.

1) С произволен идентификатор, от https://stackoverflow.com/a/4329447/2051938

SELECT *
FROM profiles AS r1
JOIN
    (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM profiles)) AS id)
        AS r2
WHERE
    r1.id >= r2.id
    AND
    r1.first_name IS NOT NULL
AND
NOT EXISTS (
    SELECT *
    FROM proposal
    WHERE
        proposal.to_id = r1.id
)
LIMIT 0 , 1

2) С ORDER BY RAND()

SELECT *
FROM
    (
        SELECT *
        FROM profiles
        WHERE
            profiles.first_name IS NOT NULL
        ORDER BY RAND()
    ) AS users
WHERE
    NOT EXISTS (
        SELECT *
        FROM proposal
        WHERE
            proposal.to_id = users.id
    )
LIMIT 0 , 1

Първото решение е по-бързо, но има проблем с „дупки в id " и когато получите id от края (потребителите може да завършат по-рано, отколкото ще има съвпадение)

Второто решение е по-бавно, но без недостатъци!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разграничители в MySQL

  2. Хибридни работни натоварвания на база данни OLTP/Analytics в клъстер Galera, използващи асинхронни подчинени устройства

  3. Голям първичен ключ:1+ милиард реда MySQL + InnoDB?

  4. Изберете последния запис от дясната таблица, когато използвате присъединяване в mysql

  5. Потребителски въведени данни, почистете и дезинфекцирайте преди изпращане в db