2010-07-07 4 views
2

J'ai un peu affaire à une base de données existante, et j'ai de la difficulté à écrire une requête de recherche. Les deux tableaux concernés sont products et tours (multiple par produit).MySQL concaténer à la colonne tout en sélectionnant

Ma requête générale ressemble à ceci:

SELECT products.*, tours.* FROM products INNER JOIN tours 
ON products.id=tours.product_id 
GROUP BY products.id 

Maintenant, voici la partie où je vais avoir du mal. La table products contient une colonne, countries, qui est une liste des ID de pays séparés par des tuyaux, comme suit: 13|45|33|29|133|337. Je dois retourner une liste de products qui ont, par exemple, le pays 33.

Pour simplifier, je pourrais faire where products.countries LIKE '%33%', mais cela retournerait également 133 et 337. Je vais devoir utiliser where products.countries LIKE '%|33|%', mais cela ne correspondra pas s'ils sont en premier ou en dernier. Par conséquent, je dois ajouter un tuyau à chaque extrémité de la valeur de la colonne lors de la sélection, ce qui me laisse quelque chose comme:

SELECT products.*, tours.*, CONCAT("|",products.countries,"|") AS country_list 
FROM products INNER JOIN tours ON products.id=tours.product_id 
GROUP BY products.id 

Mais si je tente d'ajouter WHERE country_list LIKE '|%33%|', je reçois une erreur "undefined index: country_list" ..

Qu'est-ce que je fais mal ici?

+0

try WHERE products.countries LIKE '% 33%', – helle

+0

@helle qui correspondrait également '133' et' 337', ce qui est incorrect – Jeriko

Répondre

3

alias ne sont pas availible dans les clauses WHERE. Juste à HAVING

« Un alias peut être utilisé dans une requête liste de sélection pour donner une colonne un autre nom. Vous pouvez utiliser l'alias dans GROUP BY, ORDER BY, ou HAVING de se référer à la colonne » 1

vous pouvez soit le faire

HAVING country_list LIKE '|%33%|' 

Ou le satement sans alias, que Scott affiché.

+0

Merci. J'ai utilisé la solution de Scott, mais j'accepte celui-ci parce que je pense qu'il répond le mieux à la question. – Jeriko

5

Vous pouvez utiliser:

WHERE CONCAT("|",products.countries,"|") LIKE '%|33|%' 

Notez que les tuyaux sont dans les cent signes

+0

Juste pour que je comprenne, vous ne pouvez pas référencer l'alias dans la clause WHERE , peut tu? – MJB

+0

Super, ça marche. Une explication de l'erreur, et pourquoi je ne peux pas le sélectionner? – Jeriko

Questions connexes