【问题标题】:mysql "IN" condition with subquery带有子查询的mysql“IN”条件
【发布时间】:2013-08-28 17:44:15
【问题描述】:

我需要执行以下操作:

SELECT * FROM mp_sizes 
WHERE size_id IN(SELECT size_ids FROM mp_size_categories 
WHERE category_id = '3' AND sub_category_id = '5');

当我运行以下查询时,它会返回 3 条记录。

SELECT * FROM mp_sizes WHERE size_id IN(3,2,4);

当我运行子查询时,它会显示正确的结果。

SELECT size_ids FROM mp_size_categories 
WHERE category_id = '3' AND sub_category_id = '5';

上面的查询给出了结果3, 2, 4

但是当我在子查询中使用它时,它只返回一条记录。它仅返回第一个值 (3) 的大小详细信息。

如何获得所有 3 种尺寸(3、2、4)的结果?

【问题讨论】:

  • SELECT * FROM mp_sizes a LEFT JOIN mp_size_categories b ON b.size_ids = a.size_id WHERE b.category_id IN (3, 5); - 未测试,希望对您有所帮助
  • 我不能这样使用。因为 mp_size_categories 表上的 size_ids 字段是 varchar 字段。它没有一个整数,而是所有大小的 id 都用逗号分隔,如 3,2,4
  • 你有 sql fiddle 示例吗?
  • 在逗号分隔的列表中使用多对多值会破坏数据库规范化规则。使用 group_concat 和 find_in_set 您可能会获得所需的结果集。我为你创建了一个 sql fiddle - sqlfiddle.com/#!2/5c078/2 - 不确定模式是否正确 - 至少是一个起点。希望这会有所帮助。

标签: mysql subquery conditional-statements


【解决方案1】:

您是否尝试过使用JOIN? (更快)

 SELECT * FROM mp_sizes, mp_size_categories
 WHERE size_id = size_ids AND category_id = '3'
 AND sub_category_id = '5';

【讨论】:

  • 我相信大多数人会更喜欢... FROM mp_sizes JOIN mp_size_categories ON size_id = size_ids WHERE ...(但这实际上并不能回答OP的问题)。
  • 如您所见,我的子查询(SELECT size_ids FROM mp_size_categories WHERE category_id = '3' AND sub_category_id = '5')将返回一个字符串为 3、2、4。因为字段 size_ids 是一个 varchar 字段,它的值是 3,2,4。
  • 那么您可能需要在 PHP(或其他)中进行一些字符串解析。我不知道是否可以仅使用 mysql 从字符串“3,2,4”中提取值 3、2 和 4。
【解决方案2】:

我认为您应该使用以下查询与 Join 来获得完全相同的结果,而不是使用嵌套查询,它应该比子查询更快:

select * from mp_sizes as mpsizes 
join mp_size_categories as mpsizecategories 
on mpsizes.size_id = mpsizecategories.size_ids 
where mpsizecategories.category_id = '3' 
AND mpsizecategories.sub_category_id = '5';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2017-05-22
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多