2017-09-20 3 views
0

Mein Tisch wie das ist -Wie wählen Sie zufällige Spalte von MySQL-Tabelle?

+---------+---------------+------+-----+---------+-------+ 
| PK  | ToicID  |topic1|topic2| topic3 |topic4 | 
+---------+---------------+------+-----+---------+-------+ 
| 1  | 1    | abc | xyz | mno | pqr | 
+---------+---------------+------+-----+---------+-------+ 

Ich benutze diese query-

select * from table order by rand() limit 1 

es mir nur zufällige Zeile ist zu geben. Aber ich möchte zufällig jedes Thema wählen wie folgt

Topic3 
|mno| 

================================= ========

Aber Bedingung ist, dass Spalte nicht leer oder null sein sollte.

+0

ist die Anzahl der Themen behoben? (zB 4) – etsa

+1

Mögliches Duplikat von [Wie man eine zufällige Spalte in SQL anfordert?] (https://stackoverflow.com/questions/24858797/how-to-request-a-random-column-in-sql) – fvu

+0

@etsa Ja Nummer des Themas ist behoben. – Sunny

Antwort

2

Pls können Sie überprüfen, ob dies das ist, wonach Sie fragen?

SELECT CASE FLOOR(RAND()*4+1) 
      WHEN 1 THEN TOPIC1 
      WHEN 2 THEN TOPIC2 
      WHEN 3 THEN TOPIC3 
      WHEN 4 THEN TOPIC4 END AS TOPIC_RAND 
FROM TABLE; 

Aktualisierte Version nach Kommentare und hinzugefügt Klausel-Null/leer in Frage:

select version() as 'mysql version'; 

SELECT CASE FLOOR(RAND()*4+1) /*wrote here just 1 to make tests */ 
    WHEN 1 THEN COALESCE(TOPIC1, TOPIC2, TOPIC3, TOPIC4) 
    WHEN 2 THEN COALESCE(TOPIC2, TOPIC3, TOPIC4, TOPIC1) 
    WHEN 3 THEN COALESCE(TOPIC3, TOPIC4, TOPIC1, TOPIC2) 
    WHEN 4 THEN COALESCE(TOPIC4, TOPIC1, TOPIC2, TOPIC3) END AS TOPIC_RAND 
FROM (SELECT NULLIF(TOPIC1,'') AS TOPIC1, NULLIF(TOPIC2,'') AS TOPIC2,NULLIF(TOPIC3,'') AS TOPIC3,NULLIF(TOPIC4,'') AS TOPIC4   
     FROM TTE1) A; 

Beispieldaten

CREATE TABLE TTE1 (TOPIC1 VARCHAR(10), TOPIC2 VARCHAR(10), TOPIC3 VARCHAR(10), TOPIC4 VARCHAR(10)); 
INSERT INTO TTE1 VALUES ('abc','cde','efg','hij'); 
INSERT INTO TTE1 VALUES (NULL,'k2','k3','k4'); 
INSERT INTO TTE1 VALUES ('','i2','i3','i4'); 

Ausgang:

mysql version 
1 5.7.12-log 

TOPIC_RAND 
1 cde 
2 k4 
3 i2 
+0

Ich brauche nicht, wenn die Spalte leer oder null ist, sollte es zum nächsten gehen, der Daten enthält. Wie wird es tun? – Sunny

+0

@Sunny COALESCE in der Zwischenzeit sehen ... Versuchen Sie, Lösung selbst zu finden ... In wenigen Minuten werde ich die Antwort aktualisieren. Lassen Sie mich wissen, wenn Sie die Lösung selbst finden – etsa

+0

Ihre Abfrage funktioniert nicht mit MySql. :( – Sunny

0

Ein normalisierte Schema wie dieses (Snippet) aussehen könnte:

topic_id topic_name 
     1 abc 
     2 xyz 
     3 mno 
     4 pqr 

Von hier aus wird das Problem trivial.

Verwandte Themen