Вы можете использовать RAND()
:
select x,y from
(
select t.*, @rownum := @rownum + 1 AS rank from
(
select tablea.x, tableb.y, rand() r
from tablea cross join tableb
order by x, r
) t, (SELECT @rownum := -1) r
) tr
where tr.rank%(select count(y) from tableB)<2
В приведенном выше запросе Я присоединяюсь к каждому элементу из tableA
с каждым элементом tableB
. Для каждой такой строки вычисляется значение RAND()
. Затем такая таблица сортируется по этому рангу для каждого значения от tableA
. Тогда мне нужно только выбрать первые строки X
для каждого значения.
Номер 2
в этом запросе - ваш X
.
Вы можете увидеть его в SQL Fiddle
EDIT:
Я нашел решение, в котором tableB
элементы не повторяются:
select ta.x, tb.y from
(
select y, @rownumB := @rownumB + 1 as rnB
from
(select y, rand() as r from tableB order by r) t, (SELECT @rownumB := -1) rownB
) tb,
(
select x, @rownumA := @rownumA + 1 as rnA
from tableA, (SELECT @rownumA := -1) rownA
) ta
where tb.rnB%5=ta.rnA
order by ta.x;
Над запрос делает:
- shuffles
- назначает номера строк
rnB
(0..14) к строкам перемешиваются tableB
- назначает номера строк
rnA
(0..4) к строкам tableA
- присоединяется '' TableB с использованием
tableA
%
оператора
tableB
имеет 15 элементов. Таким образом, rnB%5
даст числа (0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4). Эти номера объединяются с rnA
. Так каждая строка из tableA
соединяется с 3-мя рядами tableB
Смотрите это в SQLFiddle
Я не эксперт в MySQL, так что каждый может угодить уточнить ответ на ссылку выше –
Ваше последнее редактирование меняет ваш вопрос слишком значительно. Теперь ваш пост непоследовательный и может быть закрыт по этой причине. Вы не должны изменять вопрос таким образом, чтобы недействительный действительный ответ. Я советую вам вернуться к предыдущей версии выше и задать новый вопрос, ссылаясь выше. – rtruszk
Done + отметил ваш ответ в качестве принимаемого –