MySQL tablodan satır bir miktarın yüzde seçmek için kolay yolu?

4 Cevap php

Ben bir GET değişkeni olan bir komut dosyası var: $_GET['percentage']

Ben veri MySQL tablo var.

Şimdi bu tablodaki verilerin 100 satır olduğunu söylemek sağlar.

Pseudo-code:

SELECT data FROM table

Şimdi $_GET['percentage'] tablodan rastgele veri seçmek mümkün olacaktır?

Örneğin, (yine bir yalancı-kod olarak):

$_GET['percentage'] = 10;
SELECT 10% of data from table order by rand()

Bu mümkün değilse, bunu nasıl yapabilirim?

4 Cevap

MySQL, iki sorgularda bunu yapmak için muhtemelen en kolay. İlk olarak, tablodaki satır sayısını almak:

SELECT COUNT(*) FROM MyTable;

Sonra rasgele satır almak için sorguyu hazırlamak:

SELECT ... FROM MyTable ORDER BY RAND() LIMIT ?;

Ardından hazırlanan sorgu yürütmek ve 10 bölü sayısının değerini göndermek.

Değil her sorunun bir tek sorgu tarafından çözülmesi gerekir.


İşte eski mysql uzantısı kullanmak için düzenlenmiş bir örnek PHP script bulunuyor.

<?php

// Get the total number of rows in the table.
$sql = "SELECT COUNT(*) FROM Kingdoms";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$rows_in_table = $row[0];

// We only want a portion of the rows, specified by the user
// choice of percentage.  The count we want is therefore equal
// to the total number of rows in the table multiplied by the
// desired percentage.
$percentage = intval($_GET["percentage"]) / 100.0;
$count = intval(round($rows_in_table * $percentage));

// LIMIT makes the query return at most the number of rows specified.
// Sort randomly first (if the table has too many rows this will be slow),
// then return the first $count rows.
$sql = "SELECT * FROM Kingdoms ORDER BY RAND() LIMIT {$count}";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
  print_r($row);
}

PS: Bir SQL ifadesi içine bir değişken interpolating her zaman dikkatli olun. Bilinen bir biçime değişken zorlamak gerekir - bu durumda bir tamsayı değeri. Aksi takdirde, bir SQL Injection güvenlik açığı oluşturma riski.

Otomatik artırılır Kimlik alanını varsa kullanabilirsiniz

ID_FIELD SAHİP <= ceil (count (*) * 10/100);

Aksi bir saklı yordam, bu yardımcı olabilir.

myTable gelen columnvalue seçin NEREDE RAND () <= 0.5 ..... doğrudan çok yakın kayıtların% 50 neden olur

Bu olay çözümü yükselmeye olabilir

drop event OEAuditEvent;

DELIMITER $$

CREATE EVENT OEAuditEvent
ON SCHEDULE EVERY 1 SECOND
STARTS '2012-09-05 09:00:00'

DO
BEGIN

  DECLARE a CHAR(20);
  DECLARE b,c,d INT;
  DECLARE done INT DEFAULT FALSE;

  IF CURRENT_TIME() = '23:40:00' THEN
begin

 DECLARE cur CURSOR FOR select OE_User,count(OE_User) from RNCM_Status where     date(OE_Date)=CURDATE() group by OE_User; 
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

 OPEN cur;
 read_loop: LOOP


 FETCH cur INTO a, b;

SET c=ceil((b*5)/100);

IF done THEN

          LEAVE read_loop;
ELSE
          insert into OE_Audit(MDN,CAF,UploadedDate,OEUser,OEDate,UserCount,QCCount,intime) select MDN,CAF,UploadedDate,OE_User,OE_Date,b,c,now() from RNCM_Status where OE_User=a and date(OE_Date)=CURDATE() order by rand() limit c;
    END IF;

 END LOOP;
  CLOSE cur;
 end ;
 END IF;

END $$

DELIMITER ;