2016-04-05 4 views
0

Ich habe eine Tabelle, die 100000 Zeilen enthält und in denen gibt es eine Spalte sagen Drugname dessen Typ Varchar ist.Wie wählt man Zeilen mit allen Alphabeten und Zahlen in MYSQL?

Die Werte der Spalte können mit 0 bis 9 und A-Z oder a-z beginnen.

Ich brauche eine Abfrage, die 25000 Zeilen zurückgibt. Und von diesen 25000 Zeilen sollte es alle Alphabete und Zahlen enthalten.

Nehmen wir zum Beispiel

  • Alphabet A enthält 500 Zeilen
  • Alphabet B enthält 500 Zeilen
  • Nummer 1 enthält 400 Zeilen
  • Nummer 2 enthält 300 Zeilen etc ...

enthält alle Zahlen und Alphabete und insgesamt sollte es 25000 Zeilen haben.

+0

meinen Sie so etwas wie: 'select substring (drugname, 1,1) als Anfangs, COUNT (*) FROM Tabellenname Gruppe von substring (drugname, 1,1) '?? oder 'subString (Medikamentenname, 1,1) als initial auswählen, count (*) von (select * from tabellenname limit 25000) Eine Gruppe nach Substring (Medikamentenname, 1,1)' –

+0

Sollte die Return-Zeile für jeden Buchstaben/Zahl zählen im gleichen Verhältnis wie in der Datenbank sein? wenn 10% der Zeilen 'Z' enthalten, sollte das dann 10% der 25000 Zeilen sein? –

+0

Was hast du probiert? Bitte zeigen Sie uns einen Code ... http://StackOverflow.com/Help/how-to-ask – Pevara

Antwort

0

Zuerst wählen minimalen Satz von IDs für alle Gruppen (die durch die erste char)

select min(id) as substrId 
from the_table 
group by substr(value,0,1) 

dann die subselect verwenden, um die ausgewählten IDs ersten zurückzukehren (um alle Gruppen darstellen) und dann einige zufällige ids

select t1.* 
from the_table t1 
    left join (select min(id) as substrId 
       from the_table 
       group by substr(value,0,1)) sub on t1.id=sub.substrId 
order by ifnull(sub.substrId, 0) desc 
limit 25000 

Somit sind alle eindeutigen Gruppenmitglieder in der Endergebnismenge enthalten.

0

Aufzählung der Zeilen basierend auf dem ersten Zeichen. Verwenden Sie dann die Enumeration, um die Zeilen zu erhalten:

select d.* 
from (select d.*, 
      (@rn := if(@l = left(d.drugname, 1), @rn + 1, 
         if(@l := left(d.drugname, 1), 1, 1) 
         ) 
      ) as seqnum 
     from drugs d cross join 
      (select @rn := 0, @l := '') params 
     order by d.drugname 
    ) d 
order by seqnum 
limit 25000; 

Hinweis: Dies gibt die Zeilen mit den kleinsten Medikamentennamen für jeden Buchstaben zurück. Wenn Sie zufällig diejenigen wollen, dann verwenden Sie diese order by:

order by left(d.drugname, 1), rand() 
Verwandte Themen