2016-09-19 3 views
-2

Ich möchte zufällige Benutzerpaare zwischen unseren Datenbankbenutzern erstellen.Wählen Sie eindeutige Paare von Benutzern aus einer Tabelle nach dem Zufallsprinzip

ich die folgende Benutzertabelle haben:

Tabelle: tbl_users

user_id | name 
--------+-------------- 
1  | Jay 
2  | Ram 
3  | John 
4  | Kevin 
5  | Jenny 
6  | Tony 

Ich möchte ein zufälliges Ergebnis wie folgt generieren:

from_id | to_id 
--------+--------- 
1  | 6 
5  | 3 
2  | 4 

dies in MySQL getan werden kann, nur?

+0

Mögliches Duplikat http://stackoverflow.com/questions/4823208/how-do-i-select-unique-pairs-of-rows-from-a- table-at-random – Jagrati

+0

Da du es mit 'php' markiert hast: tu das in php. Es wird in MySQL ineffizient sein. Erzeugen Sie ein Array mit Ihren Nummern 1 ... max, verwenden Sie z. [shuffle] (http://php.net/manual/de/funktion.shuffle.php) und verwende dieses Array, um deine Paarungstabelle zu füllen (1. Wert im Array ist 1. 'from_id', 2. Wert ist 1.' to_id', 3. Wert ist 2.' from_id' und so weiter). – Solarflare

+0

Danke @Solarflare für den Kommentar, aber ich möchte zufällige Benutzer Datensätze aus der Datenbank paaren. zufällige Paarung ist einfach in PHP einzurichten, aber ich möchte von der Datenbank auswählen Abfrage. –

Antwort

0

Dies ist in der Tat ein Duplikat von a previous question, so ist die Antwort da.

Aber auch wenn es in MySQL tatsächlich möglich ist, wird dies nicht wirklich empfohlen. PHP ist ein viel besseres Werkzeug, um dies zu handhaben, da das, was Sie gerade tun, Daten gemäß einer Geschäftsregel manipuliert. Es wird sehr viel einfacher sein, dies in PHP zu erledigen, und ich vermute, dass es auch weniger ressourcenintensiv ist.

Ein möglicher Weg, dies zu tun, was ich bevorzugen würde. Führen Sie eine zufällige Sortierung in SQL durch und paaren Sie dann zwei oder zwei Zeilen gegeneinander. Etwas wie folgt aus:

$grouping = {}; 
// Fetching both rows to ensure that we actually have an even number paired up. 
while ($row = $res->fetch_array() && $row2 = $res->fetch_array()) { 
    $grouping[] = {$row['name'], $row2['name']}; 
} 

Wenn Sie für eine nicht angepaßte Benutzer aufgelistet werden, um zu ermöglichen, bewegen Sie einfach die zweite auf die Innenseite der Schleife holen. Behandeln Sie dann das möglicherweise fehlende Ergebnis dort.

0

können Sie den folgenden Code verwenden, um Ihre Liste zu generieren:

select max(from_id) as from_id, 
     max(to_id) as to_id 
from (
    select 
    case when rownum mod 2 = 1 then user_id else null end as from_id, 
    case when rownum mod 2 = 0 then user_id else null end as to_id, 
    (rownum - 1) div 2 as pairnum 
    from (
    select user_id, @rownum := @rownum + 1 as rownum 
    from 
     (select @rownum := 0) as init, 
     (select user_id from tbl_user order by rand()) as randlist 
) as randlistrownum 
) as randlistpairs 
group by pairnum; 

Schritt für Schritt, das wird:

  • um die Benutzerliste in zufälliger Reihenfolge
  • zuordnen rownumber zu es (sonst wird die Reihenfolge keine Bedeutung haben)
  • zuweisen zwei aufeinander folgende Zeilen die gleichen pairnum (rownum = 1 und rownum = 2 erhalten den Wert pairnum = 0, die nächsten zwei Zeilen werden pairnum = 1 bekommen und so weiter)
  • die erste Zeile dieser paarigen Zeilen werden die Werte from_id = user_id und to_id = null, die andere Reihe wird erhalten to_id = user_id und from_id = null
  • group by diese Paare zusammen, um sie in eine Reihe zu machen
  • wenn Sie eine ungerade Anzahl von Benutzern haben, ein Benutzer mit to_id = null am Ende, weil es keinen Partner hat

A li ttle kompakt, wenn Sie kürzeren Code bevorzugen:

select max(case when rownum mod 2 = 1 then user_id else null end) as from_id, 
     max(case when rownum mod 2 = 0 then user_id else null end) as to_id 
from (
    select user_id, @rownum := @rownum + 1 as rownum, (@rownum - 1) div 2 as pairnum 
    from 
    (select @rownum := 0) as init, 
    (select user_id from tbl_user order by rand()) as randlist 
) as randlistpairs 
group by pairnum; 
Verwandte Themen