Bir değerine uyan virgülle ayrılmış bir mysql arka arkaya gelen tüm sonuçlar döndürebilir

4 Cevap php

Ben haber veri ve kategoriler içeren bir mysql tablo var ve belli bir kategori içindeki tüm verileri slect çalışıyorum. Şu anda geri dönmek ve bu kısım bir normalize tablo kullanmak yeniden yazabilirsiniz noktada bir normalize tablo kullanarak değilim bu yüzden ben ileride yeterince düşünmüyordu.

İşte benim tablo yapısı

+---------+------------+------------+--------+----------+   
| 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|                    
+---------+------------+------------+--------+----------+   

Diyelim ki ben, bu ifadeyi kullanmaya çalışıyorum kategori 2 için tüm sonuçları dönmek istiyorum diyelim.

$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());

Ikisi de "2" ile başlar, çünkü bu haber id 2 ve 3 için sonuçları döndürür. "2" ikinci değer olduğundan ilk haber id seçili değil. Ben mysql deyimi ile basit yanlış bir şey olduğunu biliyorum ve ben birisi bana yardımcı mümkün olacağını umuyorum.

Thanks, Brooke

4 Cevap

Başka bir serin yol:

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

Herhangi bir ayraç ... / boşluk ile çalışır.

diğer mükemmel cevap ek olarak

Sadece find_in_set içindeki numarasından tırnak kaldırın. Benim için çalıştı.

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

Bu kötü bir tasarımdır. Bu şema tasarım (birinci? Ikinci? Ben hatırlamıyorum) için normalleştirme kurallarından birini çiğner.

Bir haber birçok kategoriye sahip olabilir gibi görünüyor, çünkü bir çok-çok ilişkisi var, ve bir kategori birçok haber ait olabilir. Bu şekilde modellemek ve daha iyi bir tasarıma sahip olacak.

Kullanın:

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

Referans: