2010-01-01 5 views
0

J'ai une table mysql contenant des données d'actualités et des catégories et j'essaie de découper toutes les données dans une certaine catégorie. Je ne pensais pas assez loin à l'avance, donc je n'utilise actuellement pas une table normalisée à un moment donné, je peux revenir en arrière et réécrire cette partie pour utiliser une table normalisée.retourner tous les résultats d'une ligne mysql séparés par des virgules correspondant à une valeur

Voici ma structure de table

+---------+------------+------------+--------+----------+ 
| news_id | news_title | news  | cat_id | date  |  
+---------+------------+------------+--------+----------+  
| 1  | title1  | blahblah |1,2,4,6 |2009-11-24|      
+---------+------------+------------+--------+----------+ 
| 2  | new title | text 123 | 2  |2009-01-24|      
+---------+------------+------------+--------+----------+ 
| 3  | new title3 | text 3  | 2,19,6 |2009-02-24|      
+---------+------------+------------+--------+----------+ 

Disons que je veux retourner tous les résultats pour la catégorie 2 Je suis en train d'utiliser cette déclaration.

$query= mysql_query("SELECT id FROM `news_data` WHERE FIND_IN_SET('" . str_replace(',',"',cat_id) OR FIND_IN_SET('",$cat_id)."',cat_id)") or die(mysql_error()); 

Ceci renvoie les résultats pour les identifiants 2 et 3 car ils commencent tous deux par "2". Le premier identifiant n'est pas sélectionné car "2" est la deuxième valeur. Je sais que c'est quelque chose qui ne va pas avec la déclaration mysql et j'espère que quelqu'un pourra m'aider.

Merci, Brooke

+0

Comme toujours il y a plus d'une façon de quoi que ce soit avec la programmation. Merci à tous pour vos réponses! – BandonRandon

Répondre

2

une autre façon cool:

select id from news_data where cat_id regexp '(^|[^0-9])2([^0-9]|$)'; 

... fonctionne avec n'importe quel délimiteur/espacement.

en plus des autres réponses excellentes

+0

Cela semble être le moyen le plus simple. Merci – BandonRandon

3

supprimer seulement les citations du numéro à l'intérieur FIND_IN_SET. A travaillé pour moi.

" WHERE FIND_IN_SET(" . str_replace(',',",cat_id) OR FIND_IN_SET(",$cat_id).",cat_id)") 
1

Ceci est une mauvaise conception. Il casse l'une des règles de normalisation pour la conception de schéma (première? Seconde? Je ne me souviens pas).

Il s'agit d'une relation plusieurs-à-plusieurs, car il semble qu'une rubrique peut contenir plusieurs catégories et qu'une catégorie puisse appartenir à de nombreux éléments d'actualité. Modélisez-le comme ça et vous aurez un meilleur design.

+0

Il a déjà expliqué que ce n'est pas normalisé. –

+0

Donc, je vois, mais cela ne l'excuse pas. – duffymo

+0

Je suis encore en train d'apprendre alors peut-être que la prochaine fois, j'apprendrai la «bonne façon» de faire ce genre de choses. ;) – BandonRandon

1

Utilisation:

WHERE INSTR(CONCAT(t.cat_id, ','), '2,') > 0 

Référence:

Questions connexes