0

我有一个这样的字段表

category
--------------
20,14,13,16,19

我有这个字符串:

20,16,9,5

我想查找具有此类别的产品

在 mysql 查询中。

有人有想法吗?

4

4 回答 4

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 ;
于 2014-04-03T13:27:05.727 回答
0

这取决于你的桌子是怎样的,但如果你的桌子是这样的:
id_product | id_category | 姓名 | 其他字段
尝试这种查询:SELECT

$category_array='20,16,9,5';
$query = "SELECT * FROM MYTABLE WHERE id_category IN (" . $category_array . ")";

于 2014-04-03T12:11:13.617 回答
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;
}
于 2014-04-03T11:55:44.550 回答
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
于 2014-04-03T11:47:18.580 回答