Список товаров из выбранных категорий и ценового диапазона

#javascript #php #jquery #mysql #ajax

#javascript #php #jquery #mysql #ajax

Вопрос:

Я действительно новичок в mysql и не могу хорошо понять, как правильно решить мою проблему, поэтому, если у кого-то есть подсказка или решение, это более чем приветствуется, поехали.

У меня есть две таблицы в моей БД:

продукты:

  • id_product
  • name_product
  • и т.д…

product_category:

  • id_product
  • имя_категории

Когда я сохраняю продукт с более чем одной категорией, он выглядит так в моей БД:

 id_product  category_name
1           kids
1           men
  

В моем html у меня есть такая форма:

 <div class="checkbox">
  <label><input type="checkbox" class="getcats"  value="Women">Women</label>
</div>
<div class="checkbox">
  <label><input type="checkbox" class="getcats" value="Men">Men</label>
</div>
<div class="checkbox">
  <label><input type="checkbox" class="getcats" value="Kids">Kids</label>
</div>
<div class="form-group" id="range"><input type="number" min="0" id="min" name="min" class="form-control" placeholder="0"><input type="number" min="0" id="max" name="max" class="form-control" placeholder="100">
 </div>
 <button class="boton" id="request" onclick="request()">Request</button>
  

Затем в моем JS-файле, где я выполняю вызов ajax:

 function request(){

  //get the values from price range
  var min = jQuery("#min").val();
  var max = jQuery("#max").val();

  //create array to save the selected categories
  var categories = [];

  //save all the selected categories into the array
  jQuery('.getcats').each(function(){

    if(jQuery(this).is(":checked")){
        categories.push(jQuery(this).val());
    }

  });

  jQuery.ajax({
        url: 'request.php',
        method: 'POST',
        data:{
            categories:categories,
            min:min,
            max:max
        },
        success: function(data){
            //on success, display data requested
        },
        dataType: 'json'
    }); // End of ajax call 

}
  

И, наконец, в моем php-файле:

 <?php
header("Content-type: text/javascript");

require_once($_SERVER['DOCUMENT_ROOT'].'/../../config.php');
$conn = mysqli_connect($servername, $username, $password, $db);

//here should be some code to validate price range (min and max)

//after validation assign to variables
$min = $_POST["min"];
$max = $_POST["max"]; 

//here some code to validate selected categories (checkboxes)

//after validation assign to variable

$categories = $_POST["categories"];

$categoriesList = implode("','",$Intersectedresult); //$intersectedresult comes from array_intersect($categorias,$checkCategorias)
$resultList = "'".$categoriasList."'";

//Before I had this query working well but only when a product had 1 category, but now each product can have more than 1 category so I don't know how to make that query
$randomProducts = $conn->query("SELECT * FROM products WHERE category_name IN ($resultList) amp;amp; product_price BETWEEN $min AND $max ORDER BY rand() LIMIT 3")

?>
  

Я немного исследовал и нашел некоторые термины, такие как INNER JOIN, но не могу понять, как его реализовать, чтобы иметь возможность делать что-то подобное:

 $randomProducts = $conn->query("SELECT products.product_name, products.product_image, products.product_desc, products.product_url, products.product_price FROM products INNER JOIN product_category ON product_category.category_name=women, kids or men");
  

Надеюсь, кто-нибудь сможет меня подтолкнуть, большое спасибо.

Ответ №1:

Попробуйте это:

 SELECT *
FROM products p
WHERE p.id_product IN (
 SELECT pc.id_product
 FROM product_category pc
 AND pc.category_name IN ($resultList)
)
AND p.product_price BETWEEN $min AND $max ORDER BY rand() LIMIT 3
  

Комментарии:

1. Привет, Альберто, спасибо за помощь. Я пробую ваш код и получаю эту ошибку Fatal error: Call to a member function fetch_assoc() on boolean in в этой строке после выполнения запроса: while($row = $randomProducts->fetch_assoc()){ Есть какие-нибудь подсказки?

Ответ №2:

вы можете использовать концепцию внутреннего соединения или вложенного запроса. В ответе используется 1 вложенный запрос, и вы можете попробовать это,..

Это ссылка для понимания внутреннего соединения

http://www.w3schools.com/sql/sql_join_inner.asp

Вы также можете попробовать это

SELECT products.product_name, products.product_image, products.product_desc, products.product_url, products.product_price FROM products INNER JOIN product_category ON table name.table filed=table name.table field (то, что вы собираетесь сравнивать, в основном, это идентификатор двух таблиц)

Ответ №3:

Используйте в своем запросе GROUP BY id_product

 SELECT  *
FROM    products
WHERE   category_name
    IN  ($resultList)
    AND product_price BETWEEN $min AND $max

GROUP   BY id_product
ORDER   BY rand()
LIMIT   3
  

Комментарии:

1. Привет, Джеральдо, спасибо за помощь. Как я упоминал в сообщении, запрос, который я использовал ранее, мог работать только для товаров с 1 категорией, это вы можете видеть WHERE category_name , но теперь у меня есть товары с несколькими категориями, и эти категории сохраняются в другой таблице. Итак, это моя проблема, как я могу сделать запрос, подобный последнему php-коду, который у меня есть в сообщении.

Ответ №4:

 select  *
from    product                     as PRD
        inner join product_category as CAT on PRD.id = CAT.id_product

where   CAT.category_name in ('woman', 'kids')