Visualizzazione risultati 1 fino 7 di 7
Like Tree3Likes
  • 1 Post By andreaesami
  • 2 Post By mzanella

Discussione: QUERY da rivedere..

  1. #1
    Data registrazione
    03-09-2013
    Residenza
    Los Angeles
    Messaggi
    145

    Predefinito QUERY da rivedere..

    vorrei in output solo ed esclusivamente i testi scritti insieme da autore1 e autore2, allora scrivo


    SELECT [TESTI].[TESTO], AUTORI.[NOMINATIVO]
    FROM (Lookup_TESTI_AUTORI INNER JOIN TESTI ON [Lookup_TESTI_AUTORI].[TESTIID]=[TESTI].ID) INNER JOIN AUTORI ON [Lookup_TESTI_AUTORI].AUTHORID=AUTORI.ID
    WHERE (((AUTORI.[NOMINATIVO])="AUTORE1" AND (AUTORI.[NOMINATIVO])="AUTORE2"));

    ma non funziona,,, eppure la struttura me la sono studiata bene ed è abbastanza performante ...help me
    Ultima modifica di Aforismadelgiorno : 07-06-2018 alle ore 18.17.27

  2. #2
    andreaesami non è connesso Neofita
    Data registrazione
    19-06-2018
    Messaggi
    6

    Predefinito

    Prova con

    [stessa query]
    WHERE (((AUTORI.[NOMINATIVO])LIKE "%AUTORE1%AUTORE2%" OR (AUTORI.[NOMINATIVO])LIKE "%AUTORE2%AUTORE1%"));

  3. #3
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,134

    Predefinito

    Non usare LIKE a meno che non sia strettamente necessario (ed in questo caso non lo è), poiché comporta tempi di esecuzione più lunghi.

    Il problema è causato dal fatto che stai chiedendo l'elenco dei testi per cui un autore si chiama contemporaneamente AUTORE1 e AUTORE2, che è una richiesta inconsistente.
    In realtà tu hai bisogno dei testi il cui autore è AUTORE1 o AUTORE2.

    E non hai bisogno di tutte quelle parentesi

    Codice:
    SELECT TESTI.TESTO, AUTORI.NOMINATIVO
    FROM Lookup_TESTI_AUTORI
         INNER JOIN TESTI ON Lookup_TESTI_AUTORI.TESTIID = TESTI.ID
         INNER JOIN AUTORI ON Lookup_TESTI_AUTORI.AUTHORID = AUTORI.ID
    WHERE AUTORI.NOMINATIVO = "AUTORE1" OR AUTORI.NOMINATIVO = "AUTORE2";

    I suggerimenti che do più spesso:
    • Le funzioni mysql_* sono deprecate. Usa PDO o MySQLi.
    • Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
    • Indenta correttamente il codice e usa nomi significativi per gli identificatori.


  4. #4
    andreaesami non è connesso Neofita
    Data registrazione
    19-06-2018
    Messaggi
    6

    Predefinito

    mzanella ma scusa, se volessi ritrovare tutti i libri scritti esattamente da quei due autori? Hai semplificato la query ma non è la richiesta dell'utente credo.

    Al massimo il consiglio è, visto che la relazione è molti a molti, di creare una tabella intermedia che sia composta da [testoId, autoreId] in modo tale da poter avere più autori per ogni libro e più libri per ogni autore.
    Aforismadelgiorno likes this.

  5. #5
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,134

    Predefinito

    mzanella ma scusa, se volessi ritrovare tutti i libri scritti esattamente da quei due autori? Hai semplificato la query ma non è la richiesta dell'utente credo.
    È vero, avevo letto male la richiesta! Chiedo scusa.
    In questo caso, però, la domanda è ambigua. Per esempio, supponendo di avere un libro con 3 autori A, B, C e di effettuare la ricerca congiunta per gli autori A, B, il libro deve
    • essere considerato, perché A e B lo hanno scritto insieme, oppure
    • non essere considerato, perché non è stato scritto esattamente da A e B insieme


    Al massimo il consiglio è, visto che la relazione è molti a molti, di creare una tabella intermedia che sia composta da [testoId, autoreId] in modo tale da poter avere più autori per ogni libro e più libri per ogni autore.
    Questa è presente, la Lookup_TESTI_AUTORI contiene riferimenti ad autore e testo.

    I suggerimenti che do più spesso:
    • Le funzioni mysql_* sono deprecate. Usa PDO o MySQLi.
    • Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
    • Indenta correttamente il codice e usa nomi significativi per gli identificatori.


  6. #6
    Data registrazione
    03-09-2013
    Residenza
    Los Angeles
    Messaggi
    145

    Predefinito

    esatto devo ritrovare tutti i libri scritti esattamente da quei due autori insieme cioè hanno scritto i libri insieme

  7. #7
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,134

    Predefinito

    La query in questo caso risulta un po' articolata, e va costruita per passi. Dati i nomi degli autori per cui si vuole cercare: x1, x2, ..., xn
    • estrai gli id di tutti i libri trai cui autori figura almeno x1
    • interseca il risultato precedente con gli id di tutti i libri trai cui autori figura almeno x2
    • ripeti il punto precedente per ogni autore x3, ..., xn, sempre intersecando i risultati
    • filtra il risultato ottenuto mantenendo gli id di tutti i libri che hanno esattamente n autori
    • contestualmente al punto precedente puoi anche incrociare gli id così ottenuti con quelli della tabella dei libri per recuperarne i titoli o altre informazioni

    Concretamente, per due autori con nomi X, Y e per una struttura di tabelle con nomi ragionevoli:
    Codice:
    SELECT book.id, book.title FROM
      (SELECT book.id, COUNT(author_id) AS authors_number FROM
        (SELECT book.id from
          (SELECT book_id AS id FROM book_author JOIN author ON book_author.author_id = author.id WHERE author.name = "X") AS book
          INNER JOIN book_author ON book.id = book_author.book_id
          INNER JOIN author ON book_author.author_id = author.id
          WHERE author.name = "Y"
        ) AS book
        INNER JOIN book_author ON book.id = book_author.book_id
        GROUP BY book.id
      ) AS book_info
      INNER JOIN book ON book_info.id = book.id
      WHERE book_info.authors_number = 2;
    Con nomi strani ed INSPIEGABILMENTE IN MAIUSCOLO che hai usato tu, invece:
    Codice:
    SELECT TESTI.ID, TESTI.TESTO FROM
      (SELECT TESTI.ID, COUNT(AUTHORID) AS authors_number FROM
        (SELECT TESTI.ID AS id from
          (SELECT TESTIID AS id FROM Lookup_TESTI_AUTORI JOIN AUTORI ON Lookup_TESTI_AUTORI.AUTHORID = AUTORI.ID WHERE AUTORI.NOMINATIVO = "X") AS book
          INNER JOIN Lookup_TESTI_AUTORI ON book.id = Lookup_TESTI_AUTORI.TESTIID
          INNER JOIN AUTORI ON Lookup_TESTI_AUTORI.AUTHORID = AUTORI.ID
          WHERE AUTORI.NOMINATIVO = "Y"
        ) AS book
        INNER JOIN Lookup_TESTI_AUTORI ON book.id = Lookup_TESTI_AUTORI.TESTIID
        GROUP BY book.id
      ) AS book_info
      INNER JOIN TESTI ON book_info.id = TESTI.ID
      WHERE book_info.authors_number = 2;
    alemoppo and andreaesami like this.

    I suggerimenti che do più spesso:
    • Le funzioni mysql_* sono deprecate. Usa PDO o MySQLi.
    • Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
    • Indenta correttamente il codice e usa nomi significativi per gli identificatori.


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •