我有一个包含这样字段的表
category
--------------
20,14,13,16,19
我有这个字符串:
20,16,9,5
我想找到具有此类别的产品
在mysql查询中。
有人有个主意吗?答案 0 :(得分:0)
我们可以匹配逗号分隔值
这是一个Mysql查询
SELECT tens.d*10 + ones.d AS n
FROM (SELECT 0 AS d UNION ALL
SELECT 1 AS d UNION ALL
SELECT 2 AS d UNION ALL
SELECT 3 AS d UNION ALL
SELECT 4 AS d UNION ALL
SELECT 5 AS d UNION ALL
SELECT 6 AS d UNION ALL
SELECT 7 AS d UNION ALL
SELECT 8 AS d UNION ALL
SELECT 9 AS d) AS tens
INNER JOIN
(SELECT 0 AS d UNION ALL
SELECT 1 AS d UNION ALL
SELECT 2 AS d UNION ALL
SELECT 3 AS d UNION ALL
SELECT 4 AS d UNION ALL
SELECT 5 AS d UNION ALL
SELECT 6 AS d UNION ALL
SELECT 7 AS d UNION ALL
SELECT 8 AS d UNION ALL
SELECT 9 AS d) AS ones
WHERE (tens.d*10 + ones.d) IN (20,14,13,16,19)
AND (tens.d*10 + ones.d) IN ( 20,16,9,5 )
ORDER BY n
答案 1 :(得分:0)
$myString = '20,16,9,5';
$sets = array();
foreach(explode(',', $myString) as $individualValue) {
$sets[] = 'FIND_IN_SET(' . $individualValue. ', category) > 0';
}
$whereClause = implode(' OR ', $sets);
$myQuery = 'SELECT * FROM mytable';
if ($whereClause > '') {
$myQuery .= ' WHERE ' . $whereClause;
}
答案 2 :(得分:0)
这取决于你的桌子是什么,但如果你的桌子是这样的:
id_product | id_category |名字|其他领域
尝试这种查询:
SELECT
$ category_array =' 20,16,9,5';
$ query =" SELECT * FROM MYTABLE WHERE id_category IN("。$ category_array。")";
答案 3 :(得分:0)
在这里完成一组答案是另一个应该带有健康警告的答案。
这假设对问题的完全相同的解释如下:QuentinJadeau。
即输入由一个字符串组成,该字符串包含以逗号分隔的'类别列表'。
我测试了它。我试图设置一个' SQLFiddle'但排在第二位。 ; - /我可以发布结果。
可悲的是,它按预期工作,这类似于答案' MarkBaker'提供。唯一的区别是,这是数据库中的一个功能,而不是他做的方式。这是第二种最好的方法,因为当您可以动态生成完整的SQL查询时,您可以做更多的事情。 ; - /
我做了这个回答'因为我想写一些' mysql'做了一些有用的功能'。
FIND_IN_COMMA_LIST功能
它是一个' mysql'使用逗号分隔的源列表,将其拆分并将每个项目与目标逗号分隔列表进行比较的函数,使用mysql' find_in_set'功能。它返回它找到的第一个匹配项。
测试:服务器版本:Mysql 5.5.16
以下示例将返回' x'
SELECT find_in_comma_list('1,2,x', 'a,b,c,9,x')
DROP FUNCTION IF EXISTS FIND_IN_COMMA_LIST;
DELIMITER $$
/*
needles => comma separated list of items
haystack => comma separated list of items
returns first item in 'needles' list that is found in the 'haystack' list
*/
CREATE
FUNCTION `testmysql`.`FIND_IN_COMMA_LIST` (needles VARCHAR(128), haystack VARCHAR(255))
RETURNS VARCHAR(255)
BEGIN
DECLARE which INT DEFAULT 0;
DECLARE result VARCHAR(255) DEFAULT '';
simple_loop: LOOP
SET which = which + 1;
SET result = SPLIT_STR(needles, ',', which);
IF result = '' THEN
LEAVE simple_loop;
END IF;
IF FIND_IN_SET(result, haystack) != 0 THEN
LEAVE simple_loop;
END IF;
END LOOP simple_loop;
RETURN result;
END$$
DELIMITER ;
它依赖于我在别处找到的其他功能。
DROP FUNCTION IF EXISTS SPLIT_STR;
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION `testmysql`.`SPLIT_STR`(haystack VARCHAR(255), delim VARCHAR(16), which INTEGER)
RETURNS VARCHAR(255)
BEGIN
RETURN REPLACE(
SUBSTRING(SUBSTRING_INDEX(haystack, delim, which),
LENGTH(SUBSTRING_INDEX(haystack, delim, which - 1)) + 1),
delim, '');
END$$
DELIMITER ;