2015-04-17 1 views
0

J'ai les tableaux ci-dessous avec laquelle je suis en train de créer une recherche à facettesComment créer une recherche à facettes dans mysql?

facets 

facet_id | facet_name 
-------------------- 
1  | LANGUAGES 
2  | INDUSTRIES 
3  | JOB TYPES 
4  | SALARIES 
5  | LOCATIONS 

job_facts (Note: this is a view) 

job_id | facet_id | value 
---------------------------------------- 
1  | 1  | French 
1  | 2  | Sales 
1  | 3  | Permanent 
1  | 4  | 15000-20000 
1  | 5  | New York 
2  | 1  | French 
2  | 1  | Dutch 
2  | 2  | Sales 
2  | 2  | Media 
2  | 3  | Temporary 
2  | 4  | 20000-25000 
2  | 4  | 25000-30000 
2  | 5  | New York 
3  | 1  | German 
3  | 2  | Accounts 
3  | 3  | Permanent 
3  | 4  | 10000-15000 
3  | 5  | Paris 
4  | 1  | Spanish 
4  | 2  | Marketing 
4  | 3  | Permanent 
4  | 4  | 15000-20000 
4  | 5  | London 

Je peux produire les résultats intial et la navigation à facettes en utilisant le SQL ci-dessous:

# SQL To retrieve job data: 

SELECT * FROM jobs 

# SQL To construct the intial HTML faceted navigation: 

SELECT t2.facet_name 
     , t1.value 
     , count(*) AS c 
FROM job_facts t1 
INNER JOIN facets t2 ON t1.facet_id = t2.facet_id 
GROUP BY t2.facet_name, t1.value 

Le html face nav apparaîtrait comme suit:

> LANGUAGES 
    French (2) 
    German (1) 
    Spanish (1) 
    Dutch (1) 

> INDUSTRIES 
    Sales (2) 
    Accounts (1) 
    Media (1) 
    Marketing (1) 

> JOB TYPES 
    permanent (3) 
    temporary (1) 

> SALARIES 
    10000-15000 (1) 
    15000-20000 (2) 
    20000-25000 (1) 
    25000-30000 (1) 

> LOCATIONS 
    New York (2) 
    Paris (1) 
    London (1) 

Je suis coincé sur la façon de contruct SQL pour produire la navigation facette et les résultats d'emploi dyn amicalement lorsque l'utilisateur commence à sélectionner plusieurs facettes. Par exemple, si l'utilisateur a cliqué sur la facette « français », la navigation devrait afficher comme suit:

> LANGUAGES 
    French X 

> INDUSTRIES 
    Sales (2) 
    Media (1) 

> JOB TYPES 
    permanent (1) 
    temporary (1) 

> SALARIES 
    15000-20000 (1) 
    20000-25000 (1) 
    25000-30000 (1) 

> LOCATIONS 
    New York (2) 


#The results would list: 

job_id | title       | jobtype_id | location_id | post_dt | exp_dt 
--------------------------------------------------------------------------------------------- 
1  | French Sales Job    | 1   | 1   | 2015-04-01 | 2015-05-01 
2  | French & Dutch Sales Media Job | 2   | 1   | 2015-04-01 | 2015-05-01 

Si les exercices utilisateur plus bas et sélectionnez la facette la navigation et les résultats « temporaire » devraient afficher comme suit:

> LANGUAGES 
    French X 

> INDUSTRIES 
    Sales (1) 
    Media (1) 

> JOB TYPES 
    temporary X 

> SALARIES 
    20000-25000 (1) 
    25000-30000 (1) 

> LOCATIONS 
    New York (1) 

#the results would list: 

job_id | title       | jobtype_id | location_id | post_dt | exp_dt 
--------------------------------------------------------------------------------------------- 
2  | French & Dutch Sales Media Job | 2   | 1   | 2015-04-01 | 2015-05-01 

Quel serait le SQL pour modifier les résultats des travaux et la navigation par facettes? Est-ce que quelqu'un sait d'une manière plus élégante pour réaliser ceci? Malheureusement, je ne peux pas utiliser Solr en raison d'être sur une plate-forme hébergée.

Toute aide serait appréciée.

Répondre

0

Le schéma EAV est un ours pour le code. Et ça ne va pas bien. Et le vôtre est encore pire parce que chaque facette peut être multi-évaluée.

Vous devez effectuer une "auto-jonction". La partie principale de SELECT est similaire à votre requête. Puis JOIN USING(job_id) revenir à la même paire de tables, mais cette fois-ci AND facet_id = 1 AND value = 'French'. Quelque chose comme

SELECT t2.facet_name , t1.value , count(*) AS c 
    FROM job_facts t1 
    JOIN facets t2 ON t1.facet_id = t2.facet_id 
    JOIN job_facts t3 ON t1.job_id = t3.job_id 
    WHERE facet_id = 1 AND value = 'French' -- what they selected 
    GROUP BY t2.facet_name, t1.value