簡體   English   中英

MySQL、PHP - WHERE 子句

[英]MySQL, PHP - WHERE clause

我創建如下查詢,但 WHERE 部分有問題:

$get_products = "SELECT P.*, C.`category_name`,
                 GROUP_CONCAT(`category_name` SEPARATOR ', ') 
                 AS cat 
                 FROM `products` P 
                 NATURAL JOIN `categories` C 
                 NATURAL JOIN `product_to_categories` 
                 WHERE FIND_IN_SET(`category_id`, '$answers')
                 GROUP BY `product_name` 
                 ORDER BY count(C.`category_id`) DESC"; 

所以如果我有產品,即: DB Fiddle

APPLE屬於類別: FRUIT , GREEN , ROUND
WHEEL所屬類別: MACHINES , BLACK , ROUND
BANANA屬於類別: FRUIT , YELLOW , CUBOID
PHONE屬於類別: ELECTRONICS , BLACK , CUBOID
TOMATO屬於類別: ROUND , VEGETABLE , RED
PIZZA屬於類別: ROUND , COLORFUL , DISH

select類別:圓形、水果綠色機器、蔬菜

感謝 FIND_IN_SET 我將收到:

    +--------------+---------------------+
    | product_name | cat                 |
    +--------------+---------------------+
    | APPLE        | FRUIT, GREEN, ROUND |
    +--------------+---------------------+
    | TOMATO       | VEGETABLE, ROUND    |
    +--------------+---------------------+
    | WHEEL        | MACHINES, ROUND     |
    +--------------+---------------------+
    | BANANA       | FRUIT               |
    +--------------+---------------------+
    | PIZZA        | ROUND               |
    +--------------+---------------------+

現在我正在嘗試設置強制類別之一,所以它應該像這樣工作:

  1. 我正在選擇ROUNDFRUITGREENMACHINESVEGETABLE類別的產品。

  2. 假設ROUND是主要(強制性)類別,我應該收到:

     +--------------+---------------------+ | product_name | cat | +--------------+---------------------+ | APPLE | FRUIT, GREEN, ROUND | +--------------+---------------------+ | TOMATO | VEGETABLE, ROUND | +--------------+---------------------+ | WHEEL | ROUND, MACHINES. | +--------------+---------------------+
  3. 因此,從屬於ROUND類別的所有產品中,我也在尋找FRUITGREENMACHINESVEGETABLES

    我試過這個條款:

    WHERE (category_id IN ('$main_category')
          AND (FIND_IN_SET(category_id, '$answers')));

它幾乎可以工作了。 幾乎是因為我失去了ORDER BY count ,它還返回屬於ROUND但不屬於任何其他類別的PIZZA



謝謝!

CREATE TABLE products (
  `product_id` INTEGER NOT NULL PRIMARY KEY,
  `product_name` VARCHAR(31)
);

INSERT INTO products
  (`product_id`, `product_name`)
VALUES
  ('1', 'APPLE'),
  ('2', 'WHEEL'),
  ('3', 'BANANA'),
  ('4', 'PHONE'),
  ('5', 'TOMATO'),
  ('6', 'PIZZA');

CREATE TABLE categories (
  `category_id` INTEGER,
  `category_name` VARCHAR(31)
);

INSERT INTO categories
  (`category_id`, `category_name`)
VALUES
  ('1', 'FRUIT'),
  ('2', 'GREEN'),
  ('3', 'ROUND'),
  ('4', 'MACHINES'),
  ('5', 'BLACK'),
  ('6', 'YELLOW'),
  ('7', 'CUBOID'),
  ('8', 'ELECTRONICS'),
  ('9', 'DISH'),
  ('10', 'VEGETABLE'),
  ('11', 'RED'),
  ('12', 'COLORFUL');



CREATE TABLE product_to_categories (
  `relation_ID` INTEGER,
  `product_ID` INTEGER,
  `category_ID` INTEGER
);

INSERT INTO product_to_categories
  (`relation_ID`, `product_ID`, `category_ID`)
VALUES
  ('1', '1', '1'),
  ('2', '1', '2'),
  ('3', '1', '3'),
  ('4', '2', '4'),
  ('5', '2', '5'),
  ('6', '2', '3'),
  ('7', '3', '1'),
  ('8', '3', '6'),
  ('9', '3', '7'),
  ('10', '4', '5'),
  ('11', '4', '8'),
  ('12', '5', '3'),
  ('13', '5', '10'),
  ('14', '5', '11'),
  ('15', '6', '3'),
  ('16', '6', '9'),
  ('17', '6', '12');

例如:

SELECT p.*
     , GROUP_CONCAT(COALESCE(c2.category_name,c1.category_name)) name 
  FROM products p 
  JOIN product_to_categories pc1 
    ON pc1.product_id = p.product_id 
  JOIN categories c1 
    ON c1.category_id = pc1.category_id 
  JOIN product_to_categories pc2
    ON pc2.product_id = pc1.product_id
  JOIN categories c2
    ON c2.category_id = pc2.category_id
 WHERE c1.category_name = 'round'
   AND c2.category_name IN ('ROUND','FRUIT', 'GREEN', 'MACHINES', 'VEGETABLE')
 GROUP 
    BY p.product_id
HAVING COUNT(*) > 1 ;
 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM