J'ai trois tableaux ci-dessous avec des détails connexes

1. Primary words

+----+---------+
| id | word    |
+----+---------+
| 1  | Machine |
+----+---------+
| 2  | phone   |
+----+---------+

2. Alternative words    

+----+------------+-----------+
| id | primary_id | word      |
+----+------------+-----------+
| 1  | 1          | system    |
+----+------------+-----------+
| 2  | 1          | feature   |
+----+------------+-----------+
| 3  | 2          | telephone |
+----+------------+-----------+

3. product table

+----+------------------+
| id | name             |
+----+------------------+
| 1  | mobile system    |
+----+------------------+
| 2  | computer machine |
+----+------------------+
| 3  | wired telephone  |
+----+------------------+

Maintenant, chaque fois que l'utilisateur recherche avec "machine" dans la table des produits, les résultats du produit avec le nom de la table ont "machine" ou "système" ou "fonctionnalité" et si la recherche avec "système" ou "fonctionnalité" affiche également les résultats de "machine" ou "système" ou "fonction" .ou vice-vera.

Pouvez-vous me suggérer comment résoudre celui-ci?

-1
Kamlesh 26 avril 2017 à 07:59

3 réponses

Meilleure réponse

Si je comprends bien ce que vous demandez ...

SQL

SELECT * 
  FROM Product P
 WHERE EXISTS(SELECT fw.Word  --(6) select all products that exist in this query
                FROM (SELECT pw.Word --(1) select all Primary words matching input
                        FROM PrimaryWords pw
                       WHERE pw.Word = 'machine'
                      UNION --(3) union the results from both selects
                      SELECT aw.Word --(2) select all Alternative words that match input or have its primary matching it
                        FROM PrimaryWords pw INNER JOIN AlternativeWords aw
                          ON pw.Id = aw.PrimaryId
                       WHERE pw.Word = 'machine'
                          OR aw.Word = 'machine') as fw --(4) alias the result
                WHERE p.Name LIKE '%' || fw.Word || '%'); -- (5) filter products that match the valid words

Vous pouvez lire les commentaires classés par numérotation entre ().

1
DesertFox 27 avril 2017 à 00:06

Tout d'abord, vous devez prendre ces deux données de table en une seule, puis donner la condition.

Select word from(
SELECT id,word FROM PrimaryWords
Union all
Select primaryid,word from AlternativeWords a
) where id in ( select id from primarywords where word='yoursearchketword'
Union
Select primaryid from AlternativeWords where word='yoursearchketword')

Réponse mise à jour selon votre tableau de produits .

Vous devez maintenant effectuer une jointure croisée dans la table des produits, car il n'y a aucune relation entre eux.

Une autre chose est que vous devez utiliser ici l'opérateur like pour comparer le résultat souhaité avec la colonne de nom de la table de travail. Ici, j'ai donné une petite idée de la façon d'y parvenir, mais vous pouvez facilement améliorer la même chose.

Select a.word,b.name from
  (Select word from(
    SELECT id,word FROM PrimaryWords
    Union all
    Select primaryid,word from AlternativeWords a
    ) where id in ( select id from primarywords where word='yoursearchketword'
    Union
    Select primaryid from AlternativeWords where word='yoursearchketword')) a, product b
Where a.word LIKE CONCAT('%',name, '%');
1
Rams 27 avril 2017 à 12:29

Je suggère de le mettre dans un tableau comme celui-ci:

id | primary_id | word
1 | 1 | machine
2 | 2 | phone
3 | 1 | system
4 | 1 | feature
5 | 2 | telephone

Et la requête sera comme ceci, prenons machine mot comme exemple:

Select word from MyTable where primary_id in 
             (select primary_id from MyTable where word = "machine")

La sortie: machine, system, feature


Mettre à jour

Si vous avez plus de colonnes, par exemple pour montrer à quel point ces mots sont liés, vous pouvez ajouter un autre tableau à mapper entre les mots, comme suit:

id | w1_id | w2_id | relation
1 | 1 | 3 | 80
2 | 2 | 5 | 90
3 | 1 | 4 | 60
4 | 3 | 4 | 60

Et le tableau des mots ne listera que les mots comme:

id| word
1 | machine
2 | phone
3 | system
4 | feature
5 | telephone

Dans ce fil, vous trouvez une longue discussion sur la manière dont vous devez concevoir la mise en page de votre schéma ainsi que des conseils sur la manière de récupérer vos données.

-1
Community 23 mai 2017 à 12:25