2015-01-28 2 views
1

У меня есть две таблицы (TableA и TableB)
TableA имеет 10 строк и TableB имеет 50 строк.
Я хочу, чтобы каждая строка в таблице А была соединена с X количеством строк от TableB случайным образом.Как объединить таблицы в MySQL?

Например, если TableA имеет строки (a,b,c) и TableB есть строки (p,q,r,s,t,u) и X=2, то ожидаемый результат:

a-p 
a-u 
b-r 
b-t 
c-s 
c-q 

Это соединение должно быть произвольным.

+0

Я не эксперт в MySQL, так что каждый может угодить уточнить ответ на ссылку выше –

+0

Ваше последнее редактирование меняет ваш вопрос слишком значительно. Теперь ваш пост непоследовательный и может быть закрыт по этой причине. Вы не должны изменять вопрос таким образом, чтобы недействительный действительный ответ. Я советую вам вернуться к предыдущей версии выше и задать новый вопрос, ссылаясь выше. – rtruszk

+0

Done + отметил ваш ответ в качестве принимаемого –

ответ

1

Вы можете использовать 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

+0

спасибо за ваш ответ и извините за столь поздний ответ. Результат, полученный из кода, который вы отправили, дает дубликаты записей из таблицыB после присоединения.Но значения tableB не должны повторяться, как вы можете видеть в моем примере выше –

+0

@MohdQasim Hi Mohd. Я исправил свое решение. Я думаю, что теперь он дает желаемый результат. Вы можете это оценить? – rtruszk

+0

Спасибо мужчина Я собираюсь его проверить –