Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    ricerca fulltext su due tabelle

    Scusate se sembra un doppione però forse non lo è.
    In questo post http://forum.html.it/forum/showthrea...in+due+tabelle veniva data una soluzione per il problema ma io l'ho provata adattandola al mio caso ma mi sembra che cerchi in una sola delle due tabelle, inserirsco le mie tabelle e la select (le ho semplificate per comodità)

    codice:
    CREATE TABLE contatto (
      ID smallint(6) NOT NULL auto_increment,
      nome varchar(255) default NULL,
      cognome varchar(255) default NULL,
      modello_scelto varchar(255) default NULL,
      PRIMARY KEY  (ID),
      KEY ID (ID),
      FULLTEXT KEY cod_venditore (nome,cognome)
    ) TYPE=MyISAM; (
    e l'altra

    codice:
    CREATE TABLE vettura (
      ID_vettura smallint(6) NOT NULL auto_increment,
      modello varchar(255) NOT NULL default '',
      marca varchar(255) NOT NULL default '',
      PRIMARY KEY  (ID_vettura),
      KEY ID_vettura (ID_vettura),
      FULLTEXT KEY marca (marca,modello)
    ) TYPE=MyISAM;
    select

    codice:
    "SELECT contatto.ID, vettura.ID_vettura, vettura.marca, vettura.modello, contatto.nome, contatto.cognome, contatto.modello_scelto,
    MATCH(contatto.nome, contatto.cognome) 
    AGAINST('$word') AS score
    FROM contatto INNER JOIN
    vettura on vettura.ID_vettura = contatto.modello_scelto 
    MATCH (vettura.marca, vettura.modello) 
    AGAINST ('$word')
    ORDER BY score DESC "
    con questo codice cerca solo nella tabella vettura (il secondo MATCH), ho provato a inserire tutti i campi e renderli uguali in entrambi i MATCH ma restituisce un messaggio di errore del tipo
    codice:
    Wrong arguments to MATCH
    Potreste aiutarmi a capire dove stò sbagliando? Vi ringrazio in anticipo per l'aiuto.

  2. #2

  3. #3
    codice:
    SELECT contatto.ID, vettura.ID_vettura, vettura.marca,
    vettura.modello, contatto.nome, contatto.cognome,
    contatto.modello_scelto,
    MATCH(contatto.nome, contatto.cognome) AGAINST('$word') AS score
    FROM contatto 
    INNER JOIN vettura on vettura.ID_vettura = contatto.modello_scelto 
    WHERE 
    MATCH (vettura.marca, vettura.modello) AGAINST ('$word')
    ORDER BY score DESC
    manca il WHERE....



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

  4. #4
    avevo dimenticato di inserirlo nel post però nel codice che ho era presente e il problema non cambia.

  5. #5
    Dovrebbe funzionare. La query postata aggiungendo il where e' corretta.

    Un appunto sulla prima tabella. Non dovresti mettere l'id due volte negli indici. Se e' chiave primaria e' anche index. L'altro indice e' solo un doppione e sarebbe meglio toglierlo.

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

  6. #6
    Niente, a me cerca solo tra i record del secondo MATCH. Quello che vorrei capire è una cosa, con questa select dovrebbe cercare la parola chiave tra i campi di entrabe le tabelle contemporaneamente e indistintamente giusto?

  7. #7
    Certo... ma cerca due cose diverse...

    Il match nella select ti fa una valutazione assegnando un punteggio che e' la valutazione di pertinenza dei campi alla stringa inserita.

    Il match against del where e' quello che ti pone la condizione dei record da cercare, su cui il primo match del select ci fa la statistica.

    Dovrebbero essere uguali i due match .. against , in pratica sul where scegli, sul select ti fa l'ordinamento. funziona anche come hai messo tu, ma l'ordinamento va a farsi benedire nel senso che il punteggio assegnato e' riferito ad altra tabella, e sopratutto avviene solo sui record selezionati da where.

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

  8. #8
    Ok allora porgo la domanda in maniera esplicita, se io ho la necessità di ricercare $word sulle due tabelle "contatto" e "vettura" come mi consigli di impostare la SELECT in maniera che rilevanza e ordinamento risultino correttamente valutati come mi hai fatto notare?

  9. #9
    Originariamente inviato da klavs
    Ok allora porgo la domanda in maniera esplicita, se io ho la necessità di ricercare $word sulle due tabelle "contatto" e "vettura" come mi consigli di impostare la SELECT in maniera che rilevanza e ordinamento risultino correttamente valutati come mi hai fatto notare?
    Semplificando:
    codice:
    SELECT *,
    MATCH(a.pippo, a.pallino) AGAINST('francesco') as nome,
    MATCH(b.pippo1, b.pallino1) AGAINST('fiat') as marca
    FROM contatto as a
    LEFT JOIN vettura b ON b.id_nome = a.id_nome
    WHERE
    MATCH(a.pippo, a.pallino) AGAINST('francesco')
    AND
    MATCH(b.pippo1, b.pallino1) AGAINST('fiat')
    ORDER BY nome, marca
    ovviamento l'ordinamento lo deciderai tu. Mi sembra pero' strano che $word possa coincidere con nome-cognome e modello-marca.

    Quindi probabilmente dovrai usare OR nel WHERE.


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

  10. #10
    Ti ringrazio per l'aiuto l'ultima versione di select l'ho provata ma non ha funzionato allora ho provato a inserire l'OR nel WHERE e ha funzionato tutto correttamente.

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.