【发布时间】:2012-09-10 10:43:33
【问题描述】:
我有一个选择查询要构建,但无法正常工作。我希望从更高级的 MySQL 开发人员那里得到一些建议。 所以我的表是:
CREATE TABLE IF NOT EXISTS `gv` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`option_id` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
INSERT INTO `gv` (`id`, `option_id`, `group_id`) VALUES
(1, 1, 1),
(2, 2, 2),
(3, 3, 2),
(4, 4, 3),
(5, 5, 4),
(6, 6, 4);
CREATE TABLE IF NOT EXISTS `igv` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`item_id` int(11) NOT NULL,
`gv_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
INSERT INTO `igv` (`id`, `item_id`, `gv_id`) VALUES
(1, 1, 1),
(2, 1, 3),
(3, 2, 1),
(4, 2, 2),
(6, 3, 5),
(7, 4, 2),
(8, 2, 6);
CREATE TABLE IF NOT EXISTS `items` (
`item_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
INSERT INTO `items` (`item_id`) VALUES
(1),
(2),
(3),
(4),
(5);
现在我将解释这些表的作用:
-
gv 来自 group_values。组就像一个项目的属性。例如:颜色。
- 每一行保存一个组的值。例如:组颜色 ( group_id ) 的红色 ( option_id )。
-
igv 来自项目组值。项目是我项目中的主要实体,就像产品一样。
- 每一行都包含项目和组值之间的关系。例如:一件带有红色的物品。
- 它通过 gv_id (igv.gv_id = gv.id) 链接到 gv 表。
items 来自 items :) 我已将此示例简化为只有一列 item_id。
我需要查询的内容:
好吧,在我的应用程序中,我有一个选定的项目 (my_item)(附加了 0 个或多个组值)。 我需要定义了完全相同的 group_values 的所有项目,或者没有为 my_item 组指定值。在 php 中,我可以将所有附加的组提取为带有 id 的数组,也可以提取所有 group_values。但是我没有办法从这个数据库中选择我需要的东西。 我将非常感谢为这个大量耗时的选择提供的任何输入。
谢谢!
一个简短的草图示例。在左侧,我们有匹配所有正确项目的项目(用逗号分隔)。
【问题讨论】:
-
你能举个例子吗?
-
SELECT i.item_id, igv.id, gv.option_id, gv.group_id FROM items AS i LEFT JOIN igv ON i.item_id = igv.item_id LEFT JOIN gv ON igv.gv_id = gv.id AND gv.group_id IN (1, 2) WHERE IF(gv.group_id IS NOT NULL, gv.option_id IN (1,2), 1) GROUP BY i.item_id但为此我需要首先处理所有提供的项目并提取附加的组及其值。此外,这还没有完全测试到我的应用程序中,仅在这个测试示例中。 -
对不起,但这对我没有帮助。我重读了你的问题,我假设你想将第 2 项与第 4 项匹配,因为它们的 group_id 为 2 的 option_id 均为 2,并且你不想将第 2 项与第 3 项匹配,因为它们有不同的 option_id group_id 为 4,但我不知道您是否要将项目 2 与项目 1 或项目 5 或两者匹配。
-
我不想将第 2 项与第 1 项匹配,因为我们的情况与第 3 项相同,它们对第 2 组有不同的选项。此外,如果没有为任何 CURRENT_ITEM 组附加选项然后它匹配。所以项目 5 将与任何其他项目匹配。我将发布一个简短的草图。
-
这对我来说完全没有意义。当您搜索 item_id 1 时,为什么 item_id 3 匹配? option_id 和 group_id,5 和 4,不被其他项目使用。恐怕我根本不明白你在追求什么。
标签: mysql group-by group-concat mysql-select-db