PHP ile MySQL Sorgusunda Çoklu Arama Yapma
Merhaba PT
- items
-------------------------------------
| item_id | item_name | item_filter |
-------------------------------------
| 1 | prototurk | 1,3,4 |
| 2 | soru | 1 |
| 3 | cevap | 6,3 |
| 4 | alani | 1,2,3 |
-------------------------------------
$itemSQL = "SELECT * FROM items";
$itemQuery = $db -> prepare($productSQL);
$itemQuery -> execute();
$itemRows = $itemQuery -> fetchAll(PDO::FETCH_ASSOC);
şeklinde bir tablom var. Ben bu tabloda item_filter
kolonumun içindeki virgülle ayrılmış verilerden sorguda filtreleme yapmak istiyorum.
Örneğin 1 ve 3'ü gönderdiysem 1 ve 4 ID numaralı verinin dönmesini,
Sadece 1 gönderdiysem 1 - 2 - 4 ID numaralı verinin dönmesini istiyorum.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (7)
Buradaki cevap der ki FIND_IN_SET
sadece bir değer aramak için kullanılabilir.
Hemen aşağısında bulunun bu cevap da bir 'trick' ile yakın da olsa tam bir çözüm bulamamış.
Bu cevap ise aradığınız şeye en yakın cevap gibi ama sorgu yapısı dinamik olduğu için aradığınız değer sayısına göre kodda düzenleme yapmanız gerekecekir.
Eğer item_filter kolonunun içindeki veriler virgülle ayrılmış bir dizi ise, bu diziyi explode fonksiyonu ile bir diziye dönüştürebilirsiniz.
Örneğin:
$filterValues = explode(",", $row['item_filter']);
Bu sayede $filterValues dizisi içinde item_filter kolonundaki değerleri bulabilirsiniz. Daha sonra bu dizi içinde arama yaparak ilgili verileri filtreleyebilirsiniz.
Örneğin:
foreach ($itemRows as $row) {
$filterValues = explode(",", $row['item_filter']);
if (in_array(1, $filterValues) && in_array(3, $filterValues)) {
// Bu satırda 1 ve 3 değerleri bulunuyor, bu veriyi kullanabilirsiniz
}
else if (in_array(1, $filterValues)) {
// Bu satırda sadece 1 değeri bulunuyor, bu veriyi kullanabilirsiniz
}
// Diğer filtreleme seçeneklerini burada yazabilirsiniz
}
Bu sayede $itemRows dizisindeki verileri istediğiniz gibi filtreleyebilirsiniz. Umarım bu bilgi size yardımcı olur.
@qplot hocam bahsettiğiniz şekilde de olsa istediğim sonucu vermeyecek, çünkü 1 ve 3'ün yan yana olması gerekiyor bahsedilen sorguda item_filter
'ın 1,2,3 şeklinde olduğu bir durumda sonucu getirmeyecektir.
$itemSQL = 'SELECT * FROM items WHERE item_filter REGEXP "1" AND item_filter REGEXP "3"';
abdullahx hocam yukarıdaki sorguda istediğim sonuca ulaştım, bende yardımlarınız için çok teşekkür ederim. :)
Sorunuzun cevap mysql find_in_set() fonksiyonudur.