WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL query (https://www.wn.se/forum/showthread.php?t=1066579)

niklas_SWED 2016-03-31 11:22

MySQL query
 
Hej,

Behöver hämta ut alla raderna från en tabell (SELECT * FROM table) och sedan till mitt problem: uppdatera _slumpmässigt_, _30% av raderna_.

Någon som har någon idé hur denna query kan se ut i min php-fil.

nosnaj 2016-03-31 11:36

Citat:

Ursprungligen postat av niklas_SWED (Inlägg 20516811)
Hej,

Behöver hämta ut alla raderna från en tabell (SELECT * FROM table) och sedan till mitt problem: uppdatera _slumpmässigt_, _30% av raderna_.

Någon som har någon idé hur denna query kan se ut i min php-fil.

Är det många rader?

Finns otaligt många sätt att utföra det på, ett förslag som dök upp i min hjärna innan lunchen hägrar är:

1. Hämta hem radernas ID och släng in i array
2. I PHP slumpar du fram 30% av dessa ID:n m.h.a array-rand()
3. Uppdatera dessa rader i mysql

Slumpen i array-rand är säkert inte superhög, men är det inte viktigt med exakt slump fungerar detta bra :)

niklas_SWED 2016-03-31 12:01

Har ca 20 000 rader som jag hämtar från tabellen.

niklas_SWED 2016-03-31 12:43

Skulle man kunna göra så här måntro?

$sql = mysql_query("SELECT id FROM table WHERE RAND() < 0.3 AND color='green' ");
while ($row = mysql_fetch_array($sql)) {

mysql_query("UPDATE newtable SET value='new_value' WHERE id='".$row[0]."' ");

}

Kimppa 2016-03-31 21:27

Citat:

Ursprungligen postat av niklas_SWED (Inlägg 20516815)
Skulle man kunna göra så här måntro?

$sql = mysql_query("SELECT id FROM table WHERE RAND() < 0.3 AND color='green' ");
while ($row = mysql_fetch_array($sql)) {

mysql_query("UPDATE newtable SET value='new_value' WHERE id='".$row[0]."' ");

}

Jadå. Det där ser ut som något som skulle få jobbet gjort!

SvanteH 2016-04-01 12:31

Kanske slippa involvera PHP mer än nödvändigt?

(Otestat men bör fungera i teorin)
Kod:

UPDATE newtable,
      (SELECT id
        FROM  table
        WHERE  Rand() < 0.3) AS randIds
SET    value = 'newvalue'
WHERE  newtable.id = randIds.id


x264 2016-04-30 19:23

Ett alternativt svar till SvanteH (nästan identiska men ville bara visa en alternativ form):

I en tabell med 2 097 152 rader om du ska sätta samma värde till alla (annars kan du skriva en funktion som uppdaterar de); tar bara några sek så är alla uppdaterade med en query!

Men säg att du ta bort 30% slumpmässiga rader och du har en kolumn som heter deleted:

Kod:

UPDATE test AS org
        INNER JOIN
    (SELECT
        RAND() AS randNr, test.id
    FROM
        test
    HAVING randNr <= 0.3) AS ra ON org.id = ra.id
SET
    deleted = 1;

Detta är bara för att visa att man kan lägga in nya "columner" i svaret i select-satsen.

Fungerar ju på samma sätt såklart. Man kan även använda en switch-sats i queryn; värt att kolla in om du vill lära dig lite mer om det :)

EDIT:

Såg att det var ett lite sent svar så ber om ursäkt för det.
Testa även att skriva explain före queryn så kan du jämföra olika typer av frågesatser.


Alla tider är GMT +2. Klockan är nu 08:55.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson