【问题标题】:Get rows with matching values in column in same table在同一个表的列中获取具有匹配值的行
【发布时间】:2014-02-14 09:18:34
【问题描述】:

我有以下 DDL...

CREATE TABLE IF NOT EXISTS `product` (
  `id_product` int(10),
  `id_manufacturer` int(10)
  );


INSERT INTO `product` (`id_product`, `id_manufacturer`) VALUES
(1,1),
(2,1),
(3,2),
(4,1),
(5,2);

CREATE TABLE IF NOT EXISTS `feature_product` (
  `id_feature` int(10),
  `id_product` int(10),
  `id_feature_value` int(10)
);


INSERT INTO `feature_product` (`id_feature`, `id_product`, `id_feature_value`) VALUES
(5, 1, 9),
(5, 2, 9),
(5, 3, 10),
(5, 4, 10),
(7, 5, 10);

http://sqlfiddle.com/#!2/cbe05/1/0

您能否解释一下,我如何才能获得 - 具有相同制造商和相同 Feature_value 的所有产品?

现在(在项目中)我使用 2 个额外的 SELECT(用于获取 id_manufacturer 和 id_feature_value),但也许有更正确(和快速)的方法?

感谢您的宝贵时间,对不起我的英语)

我也需要看到这样的结果:

id_product | 
-----------|
1          |
2          |

只有这两种产品具有相同的制造商和(同时)相同的特征值

【问题讨论】:

  • 想要的结果是什么样的?
  • 已添加,感谢您对编辑的帮助

标签: mysql sql optimization join inner-join


【解决方案1】:

只需使用 GROUP_CONCAT:

SELECT GROUP_CONCAT(p.id_product SEPARATOR '\n') AS Products FROM product p INNER JOIN feature_product fp ON (p.id_product = fp.id_product AND fp.id_feature = 5) GROUP BY p.id_manufacturer, fp.id_feature_value HAVING COUNT(p.id_manufacturer) > 1 AND COUNT(fp.id_feature_value)>1;

这将为您提供在一行中具有多个制造商 ID 和功能值的产品列表,并以换行符分隔。您可以根据需要更改分隔符。

这里是 SQL Fiddle 链接:

http://sqlfiddle.com/#!2/cbe05/70

【讨论】:

  • 我补充了问题,也许我第一次提供了不好的解释,谢谢您的回复
  • 如果您将输出放在由分隔符分隔的一行而不是放在两个不同的行中,可以吗?
  • ...当然我可以在 php.ini 中“爆炸”结果。那么,不可能在 2 个不同的行中得到结果?
  • 两行似乎很难。我可以给你一个结果,在一行中用换行符分隔。
  • 嘿,在添加这个问题之前,我阅读了文档/示例 - 分组,拥有,计数 - 但不明白如何在我的案例中应用它们。非常感谢您的回答,这是非常好的解决方案,我会更深入地研究 mysql 文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多