【问题标题】:Mysql query IN clause return resultsMysql查询IN子句返回结果
【发布时间】:2018-07-15 06:37:39
【问题描述】:

美好的一天!所有星期五,

我的 sql 查询有问题。我正在使用带有这样子查询的 IN 类

SELECT
  cm.category_id,
  cd.name
FROM
  category_master cm,
  category_detail cd,
  brand_to_categories b2c
WHERE
  cm.category_id = b2c.category_id
  AND
  cd.category_id = cm.category_id
  AND
  cd.language_id = 1
  AND
  cm.status <> 2
  AND
  cm.category_id IN (SELECT DISTINCT sub_dd.categories FROM distribution_master bdm, distribution_detail bdd, subscription_category_to_brand_user sub_dd WHERE bdd.distribution_id = bdm.distribution_id AND bdm.distributor_id = 35 AND bdd.brand_id = 7191 AND sub_dd.sub_d_id = bdd.id)
  AND
  b2c.brand_id = 7191;

以下是给我带来问题的子查询。

cm.category_id IN (
SELECT DISTINCT 
sub_dd.categories 
FROM 
distribution_master bdm, 
distribution_detail bdd, 
subscription_category_to_brand_user sub_dd 
WHERE 
bdd.distribution_id = bdm.distribution_id 
AND 
bdm.distributor_id = 35 
AND 
bdd.brand_id = 7191 
AND 
sub_dd.sub_d_id = bdd.id)

子查询的结果是这样的。

3913,4517,6059,7137,7138,7139,7140,7141,7144

此结果仅来自目标表中的单行,因为我将这些 id 作为字符串存储在字段中。

现在的问题是,我无法获得所有类别的结果。主查询最终结果只返回category_id3913的一类信息。但是,如果我使用子查询值而不是子查询手动运行此查询,那么它会返回所有类别结果。

带有子查询值的手动查询是这样的

SELECT
  cm.category_id,
  cd.name
FROM
  category_master cm,
  category_detail cd,
  brand_to_categories b2c
WHERE
  cm.category_id = b2c.category_id
  AND
  cd.category_id = cm.category_id
  AND
  cd.language_id = 1
  AND
  cm.status <> 2
  AND
  cm.category_id IN (3913,4517,6059,7137,7138,7139,7140,7141,7144)
  AND
  b2c.brand_id = 7191;

请帮我解决这个问题。

抱歉忘记了,我用的是Mysql

【问题讨论】:

  • 2 个问题。 1:这是 mysql 还是 sql-server ?两者都非常不同。 2:你能不能用 ansi join 语法代替这种非常过时的语法。
  • 抱歉我忘记了,我用的是Mysql

标签: php mysql


【解决方案1】:

假设您使用的是 MySQL,请使用 FIND_IN_SET:

WHERE
    ...
    FIND_IN_SET(cm.category_id,
                (SELECT DISTINCT sub_dd.categories
                 FROM distribution_master bdm,
                      distribution_detail bdd,
                      subscription_category_to_brand_user sub_dd
                 WHERE bdd.distribution_id = bdm.distribution_id AND
                       bdm.distributor_id = 35 AND
                       bdd.brand_id = 7191 AND
                       sub_dd.sub_d_id = bdd.id)) > 0

如果您使用的是 SQL Server,那么我们需要做更多的工作:

WHERE ',' + (SELECT DISTINCT ...) + ',' LIKE '%,' + cm.category_id + ',%'

一般评论:避免将 CSV 数据存储在 SQL 表中。 MySQL 通过提供FIND_IN_SET 并使其更容易绕过良好的表设计,几乎使问题变得更糟。

【讨论】:

  • 对不起,先生,我忘记了,我正在使用 Mysql。感谢您的回复
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 2013-11-10
  • 2015-04-02
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多