MySQL: Come faccio ad aggiornare il 50% delle righe, selezionati in modo casuale?

Voglio aggiornare il 50% delle righe in una tabella, selezionati in modo casuale. C’è qualche modo per farlo?

Edit: Giusto per chiarire che si deve sempre aggiornare il 50% di record, ma di queste il 50% le righe devono essere selezionati in modo casuale (non solo la parte superiore del 50%, per esempio). In altre parole, in media, ogni record deve essere aggiornato.

InformationsquelleAutor James | 2012-06-18

 

4 Replies
  1. 30

    Dovrebbe funzionare così:

    UPDATE table SET x = y WHERE RAND() < 0.5

    Sì, provato, funziona. Ma, naturalmente, è solo il 50% delle righe in media, non esattamente il 50%.

    Come scritto in SQL 92 specifiche, il WHERE clausola deve essere eseguita per ogni tupla, in modo che il rand() deve essere rivalutati ottenendo il risultato voluto (invece di selezionare tutte o senza righe in tutto).

    Estratto dalla specifica (sottolineatura mia):

    Regole Generali

    1) Il <search condition> viene applicato a ogni riga di T. Il risultato
    del <where clause> è una tabella con le righe di T per i quali
    il risultato della <search condition> è vero.

    2) Ogni <subquery> in <search condition> è effettivamente eseguita per ogni riga di T e i risultati nell’applicazione
    del <search condition> a riga di T. Se qualsiasi eseguito
    <subquery> contiene un riferimento esterno a una colonna di T, allora
    il riferimento è al valore della colonna in una riga di
    T.

    • Certo che sarebbe l’aggiornamento di righe metà del tempo, e nessuno a tutti per l’altra metà?
    • E c’è un altro problema: anche se funziona come previsto, potrebbe non aggiornare tutte le righe – o l’aggiornamento di tutte le righe. RAND() è casuale, si sa. )
    • no, la clausola where viene valutata per ogni tupla.
    • Ho aggiornato la domanda…
    • Se questo non funziona, funziona solo su MySql (che è quello che l’OP sta utilizzando, so) – sicuramente solo UPDATEtutto-o-niente di nuovo sul MSSql.
    • bene, è ancora corretto. Hai scritto “In altre parole, in media, ogni record deve essere aggiornato.”. Questo è quello che viene fatto qui, IN MEDIA :). Utilizzare raina77ow risposta se si vuole esattamente il 50%. Tuttavia, le prestazioni della sua soluzione potrebbe non essere troppo buono per tabelle di grandi dimensioni, e a causa della legge dei grandi numeri, la mia condizione dovrebbe avvicinarsi al 50% più grande è la tabella).
    • Ok, grazie proverò tardi da oggi 🙂
    • Guardato nelle specifiche, citato nella mia risposta. Il comportamento che ho detto è corretto. Se Mssql compila la query per un tutto-o-niente di esecuzione, quindi Mssql non implementano lo standard correttamente (non sarebbe il primo prodotto MS che non si cura di norme, cfr. IE e gli standard W3C…)

  2. 7

    Come ho detto, che è una lunga strada, descritto in una sorta di pseudocodice. )

    $x = SELECT COUNT(*) FROM some_table;
    @ids = SELECT id FROM some_table ORDER BY RAND() LIMIT $x / 2;
    UPDATE some_table WHERE id IN (@ids);
    • Si può esprimere con una sola query. Quindi è possibile utilizzare SQL standard e senza strani pseudocodice estensioni.
  3. 0

    RAND dovrebbe essere casuale e non sarà possibile ottenere una solida percentile spalato.

    Sarebbe meglio utilizzare l’operatore di modulo % trovare ogni X numero di elementi. Questo funziona meglio con unico colonne id come Chiave Primaria.

    Provare a eseguire questa query, assicurarsi di specificare il nome della tabella e colonna id nome:

    Selezionando ogni 2 ° fila, divisibile per 2

    SELECT * from <your_table_name> where <id_column_name> %2=0

    Selezionando ogni 6 ferri, divisibile per 6

    SELECT * from <your_table_name> where <id_column_name> %6=0

    Una volta lepre felice che il SELECT risultati di guardare bene, è possibile modificare la query di aggiornamento e di sintassi per aggiornare i record, utilizzando la stessa WHERE clausola

Lascia un commento