v2.5.2
Giriş yap

PHP ile MySQL Sorgusunda Çoklu Arama Yapma

redline
595 defa görüntülendi ve 1 kişi tarafından değerlendirildi

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.

Cevap yaz
Cevaplar (7)
abdullahx
753 gün önce

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.

Test senaryosu

h4ckdr0
743 gün önce

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.

redline
752 gün önce

@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. :)

qplot
753 gün önce

bazen bu sekılde kullanman gerekıyor

$itemSQL = 'SELECT * FROM items WHERE FIND_IN_SET(item_filter,"1,3")';
abdullahx
753 gün önce

Ekstra olarak size 'gerçekten açıklayıcı şekilde sorular sorduğunuz' için de teşekkür etmek istiyorum :)

redline
753 gün önce

@bugraskl hocam FIND_IN_SET()'i araştırmalarım sonucu görmüştüm ama ben mi kullanamadım bilemedim. :)


$itemSQL = 'SELECT * FROM items WHERE FIND_IN_SET("1,3", item_filter)';

şeklinde sorgu yaptığımda sonuç 0 dönüyor. :)

bugraskl
753 gün önce

Sorunuzun cevap mysql find_in_set() fonksiyonudur.

Buradan inceleyebilirsiniz