2010-10-05 9 views
0

J'essaie de créer un index Web. Chaque annonceur dans ma base de données pourra apparaître sur quelques catégories, donc je l'ai ajouté une colonne categorys, et dans cette colonne je vais stocker les catégories séparées par « » il ressemblera:Sélection de lignes à partir de MySQL

1,3,5 

Le problème est que je ne sais pas comment je suis censé sélectionner tous les annonceurs dans une certaine catégorie, comme: mysql_query("SELECT * FROM advertisers WHERE category = ??");

+2

'et dans cette colonne il stocke les catégories séparées par", "' Il serait préférable de les normaliser dans une table séparée. –

Répondre

1

Vous devez concevoir votre base de données d'une autre manière. Jetez un oeil à Atomicity.
Courte: Vous ne devriez pas stocker votre valeur sous la forme de 1,3,5.

Je ne vais pas vous donner une réponse parce que si vous vous l'utilisez à partir de cette façon maintenant, vous allez rencontrer des problèmes beaucoup plus graves plus tard. Aucune infraction :)

3

Si categories est une autre table de base de données, vous ne devez pas utiliser un champ de texte brut comme ça. Créer un "tableau croisé dynamique" à cet effet, quelque chose comme advertisers_categories qui relie les deux tables ensemble. Avec la configuration, vous pouvez faire une requête comme:

SELECT A.* FROM advertisers AS A 
JOIN advertisers_categories AS AC ON AC.advertiser_id = A.id 
WHERE AC.category_id = 12; 

Le schéma de advertisers_categories ressemblerait à quelque chose comme ceci:

# advertisers_categories 
# --> id INT 
# --> advertiser_id INT 
# --> category_id INT 
+1

+1 pour inclure la requête (je ne me souviens pas de la vie de moi comment rejoindre les tables XD) – stevendesu

+0

Merci beaucoup :) – Ben

+1

@Ben Si vous l'aimez, acceptez la réponse. :) À en juger par le représentant 1, j'imagine que vous venez de commencer ici. – BBonifield

0

Votre mise en œuvre en l'état, il sera difficile et taxer sur les ressources de votre serveur à fais ce que tu veux.

Je vous recommande de créer une table qui associe les annonceurs aux catégories, puis d'interroger cette table en fonction d'une valeur d'identifiant de catégorie afin d'obtenir les annonceurs appartenant à cette catégorie.

0

C'est un très mauvais façon de définir des catégories, car votre tableau de valeurs ne peut pas être normalisé. Au lieu de cela, définissez une autre table appelée CATEGORIES et utilisez une table JOIN pour faire correspondre CATEGORIES avec ADVERTIZERS.

Seulement alors vous serez en mesure de le sélectionner correctement.

Espérons que cela aide!

1

Il n'est pas possible d'avoir des valeurs séparées par des virgules pour le faire strictement dans une requête SQL. Vous pouvez retourner chaque ligne et avoir un script PHP qui passe par chaque ligne, en utilisant explode($row,',') puis if(in_array($exploded_row,'CATEGORY')) pour vérifier l'existence de la catégorie.

La solution la plus courante consiste à restructurer votre base de données. Vous pensez aussi à deux dimensions. Vous recherchez le Many to Many Data Model

advertisers 
----------- 
id 
name 
etc. 

categories 
---------- 
id 
name 
etc. 

ad_cat 
------ 
advertiser_id 
category_id 

Ainsi ad_cat aura au moins une entrée (généralement plus) par annonceur et au moins une entrée par catégorie (généralement plus), et chaque entrée ad_cat reliera un annonceur une catégorie.

La requête SQL consiste ensuite à saisir chaque ligne de ad_cat avec les category_id (s) souhaités et à rechercher un annonceur dont l'identifiant se trouve dans la sortie de la requête résultante.

Questions connexes