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

    [MySQL] Unire due SELECT sulla stessa tabella

    Salve a tutti,
    In questa disccussione parlavo di una tabella friendships con due campi firstuser_id e seconduser_id per rappresentare l'amicizia tra due utenti.
    Ora, vorrei poter interrogare il database per ottenere tutti gli amici di un utente. Il problema è che l'id dell'utente può essere sia il primo che il secondo, e non so come fare a interrogare il database in modo che mi restituisca una tabella con una sola colonna contenente gli id degli amici e tante righe quanti sono gli amici.
    Avevo pensato a una cosa tipo
    codice:
    (SELECT firstuser_id FROM friendships WHERE seconduser_id = '$idutente') UNION (SELECT seconduser_id FROM friendships WHERE firstuser_id = '$idutente')
    Ma ovviamente non funziona perchè le due colonne hanno nomi diversi.
    Come fare?
    Mi contraddico facilmente, ma lo faccio così spesso che questo fa di me una persona coerente [Caparezza]
    Se la conoscenza crea problemi, non è con l'ignoranza che li si risolve [Isaac Asimov]
    >>>Visita il mio blog<<<

  2. #2
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    codice:
    (SELECT firstuser_id as idUtente FROM friendships WHERE seconduser_id = '$idutente') 
    UNION 
    (SELECT seconduser_id as idUtente FROM friendships WHERE firstuser_id = '$idutente')
    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  3. #3
    Grazie mille funziona
    Però ho provato a inserirlo in un'altra query
    codice:
    "SELECT id FROM posts WHERE user_id IN((SELECT firstuser_id FROM friendships WHERE seconduser_id = 1) UNION (SELECT seconduser_id FROM friendships WHERE firstuser_id = 1))"
    E mi da errore:
    codice:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION (SELECT seconduser_id FROM friendships WHERE firstuser_id = 1))' at line 1
    Cosa sbaglio?
    Mi contraddico facilmente, ma lo faccio così spesso che questo fa di me una persona coerente [Caparezza]
    Se la conoscenza crea problemi, non è con l'ignoranza che li si risolve [Isaac Asimov]
    >>>Visita il mio blog<<<

  4. #4
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    che continui a usare la tua

    codice:
    SELECT id FROM posts WHERE user_id IN(
    (SELECT firstuser_id  as idUser   FROM friendships WHERE seconduser_id = 1) 
    UNION 
    (SELECT seconduser_id  as idUser   FROM friendships WHERE firstuser_id = 1) )
    as idUser serve a fare in modo che le due select restituiscano risultati omogenei in modo da poter essere unite.

    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  5. #5
    Non funziona comunque, stesso identico errore
    Eppure da sola la query funziona, cioè se faccio
    codice:
    (SELECT firstuser_id FROM friendships WHERE seconduser_id = $idutente) UNION (SELECT seconduser_id FROM friendships WHERE firstuser_id = $idutente);
    Mi restituisce tranquillamente i risultati
    Mi contraddico facilmente, ma lo faccio così spesso che questo fa di me una persona coerente [Caparezza]
    Se la conoscenza crea problemi, non è con l'ignoranza che li si risolve [Isaac Asimov]
    >>>Visita il mio blog<<<

  6. #6
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Originariamente inviato da las
    as idUser serve a fare in modo che le due select restituiscano risultati omogenei in modo da poter essere unite.
    Intanto mi correggo, sembra che funzioni tranquillamente anche senza l'alias.

    per metterla nella subquery prova così:

    codice:
    SELECT id FROM posts WHERE user_id IN ( 
    	SELECT * FROM (
    		(SELECT firstuser_id  FROM friendships WHERE seconduser_id = 1) 
    			UNION 
    		(SELECT seconduser_id FROM friendships WHERE firstuser_id = 1)
    	)	AS VirtualTab
    )
    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  7. #7

    funge!
    Mi potresti spiegare come mai? E cosa significa quel "AS VirtualTab"?

    Grazie mille
    Mi contraddico facilmente, ma lo faccio così spesso che questo fa di me una persona coerente [Caparezza]
    Se la conoscenza crea problemi, non è con l'ignoranza che li si risolve [Isaac Asimov]
    >>>Visita il mio blog<<<

  8. #8
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    in sostanza "WHERE user_id IN" si aspetta i risultati di una sola select, quindi dato che tu ne devi fare 2 le unisci tutte in un unica select mettendole al posto della tabella, in pratica normalmente faresti:

    codice:
    SELECT id FROM posts WHERE user_id IN ( 
    	SELECT * FROM Tabella
    )
    mentre in caso di unione fai:

    codice:
    SELECT id FROM posts WHERE user_id IN ( 
    	SELECT * FROM ( ..... unione delle 2 Select ) AS QuelloCheVuoi
    )
    in questo modo viene interpretato come se stesse facendo una SELECT sulla tabella 'QuelloCheVuoi' e tutto torna.

    Ad essere onesti non so se questo sia il sistema migliore per arrivare al risultato voluto, di sicuro non è l'unico, ad esempio un altro modo potrebbe essere quello di creare una View e forse ne esistono anche altri che non conosco.

    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  9. #9
    Cambia molto tra il fare una VIEW e l'usare quella query secondo te?
    Mi contraddico facilmente, ma lo faccio così spesso che questo fa di me una persona coerente [Caparezza]
    Se la conoscenza crea problemi, non è con l'ignoranza che li si risolve [Isaac Asimov]
    >>>Visita il mio blog<<<

  10. #10
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    be si, fare una query è sempre meglio che farne due, però adesso che leggo bene, tu fari 2 query ma sulla stessa tabella, questo a mio parere esclude l'ipotesi view (tanto sarebbe la copia della tabella e non servirebbe a nulla) però ti consente di fare un unica query con una condizione

    codice:
    SELECT 
    	CASE firstuser_id
    		WHEN 1   THEN seconduser_id
    		ELSE firstuser_id
    	END AS idUtente
    FROM friendships WHERE firstuser_id=1 || seconduser_id=1
    in pratica cerchi nella tabella tutte le righe che anno firstuser_id oppure seconduser_id uguale a 1, però per ogni riga controlli se firstuser_id è uguale a 1 (o a quello che stai cercando ) ti fai restituire seconduser_id altrimenti firstuser_id.

    quindi sulla query del post verrebbe così:

    codice:
    SELECT id FROM posts WHERE user_id IN ( 
            SELECT CASE firstuser_id
    		WHEN 1 THEN seconduser_id
    		ELSE firstuser_id
    	END AS idUtente
    FROM friendships WHERE firstuser_id=1 || seconduser_id=1
    )
    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

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.