【发布时间】:2020-03-26 09:20:20
【问题描述】:
我希望能够搜索我的产品(搜索产品名称或产品“代码”),然后过滤这些结果。
我不知道在 Google 或 SO 中搜索什么,每次我收到 Search GROUP_CONCAT using LIKE 或 Php and MySQL GROUP_CONCAT with separator comma and search where concat by comma 出现时,但我似乎无法绕过 HAVING 而不会出现错误我的数据库。我不确定这是否可能,或者我是否还差得远。
我的桌子是这样的:
产品表
+------------+--------------+----------------+-------------------------+---------------+
| product_id | product_name | product_status | product_date_available | product_type |
+------------+--------------+----------------+-------------------------+---------------+
| 1 | Rug | 1 | 2020-01-24 | 0 |
| 2 | Scraper | 1 | 2020-03-15 | 0 |
| 3 | Shovel | 0 | 2019-04-24 | 0 |
| 4 | Bucket | 1 | 2030-01-01 | 0 |
| 5 | Dog | 1 | 2018-04-27 | 0 |
| 6 | Digging | 1 | 2020-01-01 | 1 |
+------------+--------------+----------------+-------------------------+---------------+
产品类别表
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 17 |
| 2 | 22 |
| 3 | 22 |
| 4 | 17 |
+------------+-------------+
产品标签表
+------------+--------+
| product_id | tag_id |
+------------+--------+
| 1 | 11 |
| 2 | 6 |
| 3 | 7 |
| 4 | 7 |
+------------+--------+
产品代码表
+---------+------------+------------+
| code_id | product_id | code_value |
+---------+------------+------------+
| 1 | 1 | 47012.000 |
| 2 | 1 | 47012.001 |
| 3 | 2 | 47013.000 |
| 4 | 3 | 47014.000 |
| 5 | 3 | 47014.001 |
| 6 | 3 | 47014.002 |
+---------+------------+------------+
产品变体值表
+-------+------------+----------+
| pv_id | product_id | value_id |
+-------+------------+----------+
| 1 | 1 | 7 |
| 2 | 1 | 6 |
| 3 | 1 | 10 |
| 4 | 2 | 7 |
| 5 | 3 | 10 |
| 6 | 3 | 7 |
| 7 | 3 | 12 |
| 8 | 2 | 14 |
+-------+------------+----------+
这是我尝试过但无法开始工作的方法:
搜索产品代码
SELECT p.product_id,
(SELECT GROUP_CONCAT(DISTINCT code_value) FROM `me_product_variant_codes` WHERE `product_id` = p.product_id) AS codes,
(SELECT GROUP_CONCAT(DISTINCT value_id) FROM `me_product_variant_values` WHERE `product_id` = p.product_id) AS variant_values,
(SELECT GROUP_CONCAT(DISTINCT tag_id) FROM `me_product_tags` WHERE `product_id` = p.product_id) AS product_tags
FROM me_product AS p
WHERE (p.product_status = '1' AND p.product_date_available <= CONVERT_TZ(NOW(), 'SYSTEM', '+13:00') AND p.product_type = '0')
AND ((LOWER(p.product_name) LIKE '%47012%')
GROUP BY p.product_id
HAVING codes LIKE '%47012%'
AND HAVING variant_values IN(7, 10)
AND HAVING product_tags IN(11)
ORDER BY product_name DESC
LIMIT 24
我很清楚我可能有很大的错误,但经过数周的研究,我似乎没有更接近找到如何使这项工作的答案。
所以我希望作为一个例子,如果我搜索47012,它将根据上面的示例数据返回以下内容。
+------------+----------------------+----------------+--------------+
| product_id | codes | variant_values | product_tags |
+------------+----------------------+----------------+--------------+
| 1 | 47012.000, 47012.001 | 7, 6 | 11 |
+------------+----------------------+----------------+--------------+
但我目前遇到此错误
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'GROUP BY p.product_id
HAVING codes LIKE '%47012%'
AND HAVING variant_v' at line 8
即使尝试我的查询的简单版本以至少得到一些结果也会给我一个错误
简化查询
SELECT p.product_id,
(SELECT GROUP_CONCAT(DISTINCT code_value) FROM `me_product_variant_codes` WHERE `code_product_id` = p.product_id) AS codes
FROM me_product AS p
WHERE (p.product_status = '1' AND p.product_date_available <= CONVERT_TZ(NOW(), 'SYSTEM', '+13:00') AND p.product_type = '0')
AND ((LOWER(p.product_name) LIKE '%47012%')
GROUP BY p.product_id
HAVING codes LIKE '%47012%'
ORDER BY p.product_name DESC
LIMIT 24
给我这个错误
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'GROUP BY p.product_id
HAVING codes LIKE '%47012%'
ORDER BY p.product_n' at line 6
我刚刚注意到的另一个问题是,如果它与 product_name 或 codes 值之一匹配,我不确定如何返回结果
【问题讨论】:
-
您提到它不起作用,但您从未解释过问题所在。请至少显示当前和预期的输出。
-
其实你只需要定义一次
HAVING然后继续AND。类似于您的操作WHERE.. AND .. AND ...。由于product_tags和product_name是GROUP_CONCAT的结果,因此使用IN (val1, val2)可能不会返回任何内容 -
@TimBiegeleisen 谢谢,我从来没想过。我的大脑在试图弄清楚如何表达这个问题。更新信息:)
-
@tcadidot0 啊,谢谢,我什至没有想过
HAVING中的AND工作相同。我不确定product_name是GROUP_CONCAT的结果是什么意思?它是产品表中的列之一。所以你是说我不能使用IN()函数过滤? -
你的
HAVING逻辑是可疑的,看起来你想要一个逻辑的一些条件,或者你想要一个逻辑的和。