Lo chiamo hacking MySQL..
select @a as one
from
(
SELECT @a := a.id, @b := b.id
FROM Rankable a
INNER JOIN Rankable b on a.id < b.id
WHERE
a.category_id = ? AND b.category_id = ?
AND NOT EXISTS (
SELECT *
FROM Comparison c
WHERE c.lower_id in (a.id, b.id))
AND NOT EXISTS (
SELECT *
FROM Comparison c
WHERE c.higher_id IN (a.id, b.id))
ORDER BY a.id * rand()
LIMIT 1
) SQ
union all
select @b
Per unirti alla tabella per ottenere tutte le altre colonne:
select Rankable.*
from
(
select 1 as Sort, @a as one
from
(
SELECT @a := a.id, @b := b.id
FROM Rankable a
INNER JOIN Rankable b on a.id < b.id
WHERE
a.category_id = ? AND b.category_id = ?
AND NOT EXISTS (
SELECT *
FROM Comparison c
WHERE c.lower_id in (a.id, b.id))
AND NOT EXISTS (
SELECT *
FROM Comparison c
WHERE c.higher_id IN (a.id, b.id))
ORDER BY a.id * rand()
LIMIT 1
) SQ
union all
select 2, @b
) X
INNER JOIN Rankable ON Rankable.Id = X.one
ORDER BY X.Sort