Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [MYSQL] Un valore fisso e uno random

    Ho la necessità di selezionare dalla STESSA TABELLA due valori: uno con id prefisssato ed un altro in modo random.

    Ora lo faccio con queste due query ma è possibile farlo con una sola query?


    $query_2 = "SELECT nome FROM tab WHERE id = 1";
    $result_2 = mysql_query($query_2,$db);
    $row_2 = mysql_fetch_assoc($result_2);

    $query_3 = "SELECT nome FROM tab WHERE colonna = 'ok' ORDER BY RAND() LIMIT 1";
    $result_3 = mysql_query($query_3,$db);
    $row_3 = mysql_fetch_assoc($result_3);

    Grazie
    Marcello
    IO e TE 5 metri sopra il cielo.....perchè a 3 metri c'è già troppa gente.

    IO HO VISTO LA LUCE....

    Sono lo scippatore di emozioni

  2. #2
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    ho fatto delle veloci prove in locale e nn credo sia possibile...


    think simple think ringo

  3. #3
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Probabilmente ci si potrebbe riuscire, ma è uno sbattimento tale che non credo ne valga la pena

  4. #4
    Sì può, basta fare una join della tabella con se stessa.
    Supponiamo che l'ID noto sia 5, la query è:

    SELECT * FROM tabella AS tab1 JOIN tabella AS tab2 WHERE(tab1.id=5 AND tab2.id!=5) ORDER BY rand() LIMIT 1;

    Al posto di 5 ci metti il tuo id.


    Ah, io ho selezionato tutti i campi, tu puoi prendere quelli che ti servono e nel caso usare AS per rinominare opportunamente i "doppioni".

  5. #5
    [supersaibal]Originariamente inviato da luca200
    Probabilmente ci si potrebbe riuscire, ma è uno sbattimento tale che non credo ne valga la pena [/supersaibal]
    Certo che non ne vale la spesa, forse con una tabella temporanea. Ma peserebbe piu' di due SELECT. Forse il suo problema protrebbe consistere nel fatto che rischia di beccare lo stesso record di prima anche nella seconda SELECT.

    Se cosi' fosse basterebbere aggiungesse nel where la condizione di id <> 1....

    .. WHERE colonna = 'ok' AND id <> 1


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    [supersaibal]Originariamente inviato da skidx
    Sì può, basta fare una join della tabella con se stessa.
    Supponiamo che l'ID noto sia 5, la query è:

    SELECT * FROM tabella AS tab1 JOIN tabella AS tab2 WHERE(tab1.id=5 AND tab2.id!=5) ORDER BY rand() LIMIT 1;

    Al posto di 5 ci metti il tuo id.


    Ah, io ho selezionato tutti i campi, tu puoi prendere quelli che ti servono e nel caso usare AS per rinominare opportunamente i "doppioni". [/supersaibal]
    Difatti si puo' con la tabella temporanea che crea il join, ma devi rinominare tutte le colonne della tabella joinata e gestirle nella stampa.... e se domani devi estrarne due di record.... devi rivedere tutto.

    Non vale la spesa .... meglio due queries....


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    [supersaibal]Originariamente inviato da piero.mac
    e se domani devi estrarne due di record.... devi rivedere tutto.[/supersaibal]
    Se domani devi estrarne due basta mettere LIMIT 2.

    Che siano preferibili due query separate rispetto a una sola con join non è detto, dipende da molte cose:
    grandezza della tabella, memoria disponibile, velocità del collegamento tra server web e server DB, etc. etc.

  8. #8
    [supersaibal]Originariamente inviato da skidx
    Se domani devi estrarne due basta mettere LIMIT 2.
    [/supersaibal]
    se devi estrarre due random.. ok.. ma se devi estrarre due fissi e un random...?

    vabbè.. era solo per fare l'avvocato del diavolo.. non ho una cognizione sufficiente a schierarmi

  9. #9
    [supersaibal]Originariamente inviato da }gu|do[z]{®©
    se devi estrarre due random.. ok.. ma se devi estrarre due fissi e un random...? [/supersaibal]
    Si può fare lo stesso, si incasina un po' la clausola where, ma si può fare.

  10. #10
    [supersaibal]Originariamente inviato da skidx
    Se domani devi estrarne due basta mettere LIMIT 2.
    [/supersaibal]
    Beh! a vedere la AND direi che ti tira fuori il record con l'id dichiarato joinato con tutti gli altri. Quindi avresti un record con l'id 5 (nell'esempio) associato tupla per tupla a tutti gli altri id.

    Se devi estrarne due il secondo contiene nuovamente l'id 5 duplicato che sara' da scartare.... Sono tutte eccezioni che devono essere gestite. Si complica lo script e non si guadagna nulla, ne' come tempo di elaborazione, ne come riutilizzo dello script.

    Una join e' pur sempre una query che crea una tabella temporanea, la popola e poi estrai i dati. E deve valutare tutti i dati che soddisfano la condizione per poter popolare la tabella e prenderne poi uno solo. Il LIMIT non interrompe la ricerca.

    Insisto che non ne vale la pena.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.