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?
3 réponses
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 ().
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, '%');
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.
De nouvelles questions
mysql
MySQL est un système de gestion de base de données relationnelle (RDBMS) gratuit et open source qui utilise SQL (Structured Query Language). N'UTILISEZ PAS cette balise pour d'autres bases de données telles que SQL Server, SQLite, etc. Ce sont des bases de données différentes qui utilisent toutes leurs propres dialectes SQL pour gérer les données.