Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    190

    [SQL] query molto complessa

    magari è impossibile da fare
    vorrei riscontrare in un database tutte le (coppie|tris|poker) di testi indefiniti

    ovvero

    riga 1: ciao | franco | da | michele
    riga 2: ciao | michele | ci | vediamo

    queste me le deve trovare, perchè condividono una coppia (ciao e michele)

    n.b. ovviamente non so dove le parole verranno salvate.. una determinata parola potrebbe essere in uno dei quattro campi e mai ripetuta nei quattro campi della stessa riga

    e così deve funzionare fino al poker

    N.B. non deve trovare le coppie, i tris, i poker, contemporaneamente ma solo uno di questi tipi alla volta

    $cercaquanti = 2; //coppie
    $cercaquanti = 3; //tris
    $cercaquanti = 4; //poker

    le parole da trovare (nell'esempio "michele,franco,ciao,da,ci,vediamo, ecc")
    sono una cinquantina e stanno in un array

    $parole[]

    è possibile una query così evitando infinite query annidate (sempre che sia possibile anche con questo metodo)?

    ciauzz

  2. #2
    Allora, un modo ci sarebbe.
    ci sto lavorando sopra.
    Ti do la query tra qualche minuto.

  3. #3
    la prima che mi è venuta è questa:
    SELECT ((a='ciao') + (b='ciao') + (a='ciao') + (d='ciao')+(e='ciao')) as conta FROM `carte` WHERE ((a='ciao') + (b='ciao') + (a='ciao') + (d='ciao')+(e='ciao')) >1

    Questa cosa veramente brutta ti torna le righe che hanno più di un ciao nelle colonne A B C e D.
    Sto cercando di migliorartela un po'. CMQ è sempre buona.

    Se vuoi l'ID delle colonne con il tris basta che fai:
    SELECT ID FROM `carte` WHERE ((a='ciao') + (b='ciao') + (a='ciao') + (d='ciao')+(e='ciao')) =3

    guarda se riesco a migliorarla.
    Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    190
    innanzitutto ti ringrazio per il tempo dedicatomi, e per la risposta in così poco tempo, sei molto gentile

    spiegami un attimino come usarla (sql a questo livello lo capisco poco)

    SELECT ((a='ciao') + (b='ciao') + (a='ciao') + (d='ciao')+(e='ciao')) as conta FROM `carte` WHERE ((a='ciao') + (b='ciao') + (a='ciao') + (d='ciao')+(e='ciao')) >1

    a b c d ecc cosa sarebbero?
    e a "ciao" cosa devo sostituire?

  5. #5
    E' impossibile fare questo con una sola query: qualsiasi select si scriva, la condizione where consisterà sempre e comunque di condizioni che verranno applicate sui campi DI UN SOLO RECORD, mentre la richiesta è, a quanto pare, che le parole si trovino anche in campi diversi di record DIVERSI.

    Ciao!
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  6. #6
    [supersaibal]Originariamente inviato da marcobor
    innanzitutto ti ringrazio per il tempo dedicatomi, e per la risposta in così poco tempo, sei molto gentile

    spiegami un attimino come usarla (sql a questo livello lo capisco poco)

    SELECT ((a='ciao') + (b='ciao') + (a='ciao') + (d='ciao')+(e='ciao')) as conta FROM `carte` WHERE ((a='ciao') + (b='ciao') + (a='ciao') + (d='ciao')+(e='ciao')) >1

    a b c d ecc cosa sarebbero?
    e a "ciao" cosa devo sostituire? [/supersaibal]
    AH scusa, sono molto vagabomndo quando scrivo.
    A B C e D sono le colonne della mia tabella.
    Sai cosa sono le espressioni boleane?
    se io scrivo:
    A='ciao', questa torna ZERO se l'qeuazione è falsa.
    Nel caso A='ciao' è vero, torna 1!!!!
    Dunque, per vedere se le tue colonne hanno N carte uguali basta che sommi le operazioni boleane.
    Nel mio caso io comparavo ogni colonna con 'ciao', me te le devi comparare con i valori del tuo vettore.
    ((a='ciao') + (b='ciao') + (a='ciao') + (d='ciao')) >1

    Cioè, prima si iniziare con le query SQL uno dovrebbe leggersi qualche documento sulle operazioni boleane.
    Ricordo addirittura che ste cose le facevo alle elementari °_°.

  7. #7
    [supersaibal]Originariamente inviato da Shores
    E' impossibile fare questo con una sola query: qualsiasi select si scriva, la condizione where consisterà sempre e comunque di condizioni che verranno applicate sui campi DI UN SOLO RECORD, mentre la richiesta è, a quanto pare, che le parole si trovino anche in campi diversi di record DIVERSI.

    Ciao! [/supersaibal]
    L'ultima query che ho scritto torna gli ID delle righe con i campi che hanno 3 tris con la parola 'ciao'.
    Sto facendo un altra query nidificata che prende i valori da cercare in una tabella.
    One second plz

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    190
    [supersaibal]Originariamente inviato da LordSaga640
    L'ultima query che ho scritto torna gli ID delle righe con i campi che hanno 3 tris con la parola 'ciao'.
    Sto facendo un altra query nidificata che prende i valori da cercare in una tabella.
    One second plz [/supersaibal]
    mi sa che non hai capito.. effettivamente non avrei dovuto usare il termine "tris" ma il termine "terno"

    il terno (esempio)

    francesco marco michele

    non

    francesco francesco francesco

    in quali righe si ripete?

    @Shores: come temevo.. mi va bene anche con + query, tanto è un applicazione php in locale
    immagino che devo fare quattro for annidati che vanno per la lunghezza dell'array delle parole

  9. #9
    [supersaibal]Originariamente inviato da marcobor
    mi sa che non hai capito.. effettivamente non avrei dovuto usare il termine "tris" ma il termine "terno"

    il terno (esempio)

    francesco marco michele

    non

    francesco francesco francesco

    in quali righe si ripete?

    @Shores: come temevo.. mi va bene anche con + query, tanto è un applicazione php in locale
    immagino che devo fare quattro for annidati che vanno per la lunghezza dell'array delle parole [/supersaibal]
    ...

    EDIT: ne avevo fatta una che funzionava solo se le parole erano in ordine con i campi, cerco di correggere ma sarà difficile:
    SELECT carte.ID as primo,tmp.ID as secondo FROM `carte`,carte as tmp WHERE ((carte.a=tmp.a) + (carte.b=tmp.b) + (carte.c=tmp.c) + (carte.d=tmp.d)+(carte.e=tmp.e)) =2

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    190
    [supersaibal]Originariamente inviato da LordSaga640
    ... [/supersaibal]
    ?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.