0

我有以下表格:

systems
-----------
id
name
price
online
productid


specifications
-------------
id
systemid
type
componentid
quantity


components
-------------
id
name
brand
type
description

我需要使用多个选项过滤这些表。每个系统都有多个规格行,每个“规格”行都链接到相应的“组件”行。

我的问题是这样的:

我需要能够根据表连接按多个属性过滤系统。我一直在使用允许我 1 个搜索选项的代码,但没有进一步的:

select
    `systems`.`id`,
    `systems`.`name`, 
    `specifications`.`type` 
from `systems` 
    join specifications 
        on `systems`.`id` = `specifications`.`systemid` 
    join components 
        on `specifications`.`componentid` = `components`.`id`
where 
    `specifications`.`type` = 'cpu' 
    and `components`.`brand` = 'amd'

所以,这会让我做一个连接,其中规格类型是 CPU,品牌是 AMD,但是如果我添加其他东西来寻找,就像specifications.type ='graphics' AND components.brand = 'nvidia'它不起作用一样。我认为这是 join 工作方式所固有的,正如我所说,我无法在这里阐明这个问题,因为我对这些更复杂的数据库事务很陌生,并且非常感谢你指出正确的方向!

我正在使用 CodeIgniter 作为我的框架,我想尝试通过 MySQL 来了解这一点,而不是在可能的情况下在 PHP 中进行 - 因为我想更好地了解这里发生的事情。

4

2 回答 2

1

你的意思是说

select `systems`.`id`,`systems`.`name`, `specifications`.`type` from `systems`
join specifications on `systems`.`id` = `specifications`.`systemid` 
join components on `specifications`.`componentid` = `components`.`id`
where 
     (`specifications`.`type` = 'cpu' AND `components`.`brand` = 'amd') OR
     (`specifications`.`type` = `graphics` AND `components`.`brand` = `nvidia`)

不工作?

这样的事情怎么办

SELECT S.`id`, S.`name`, P.`type` FROM `systems` S 
JOIN `specifications` P ON S.`id` = P.`systemid`
WHERE S.`id` IN (

    SELECT S2.`systemid` AS id FROM `specifications` S2
    JOIN `components` C2 ON S2.`componentid` = C2.`id`
    WHERE S2.`type` = 'cpu' AND c2.`brand` = 'amd'
) AND S.`id` IN (

    SELECT S3.`systemid` AS id FROM `specifications` S3
    JOIN `components` C3 ON S3.`componentid` = C3.`id`
    WHERE S3.`type` = 'graphics' AND c3.`brand` = 'nvidia'
)
于 2012-11-01T16:06:59.277 回答
0

好的,通过让每个查询作为子查询运行,我已经让它工作了。

因此,它将所有具有 AMD 处理器的系统的 ID 返回到查找所有具有 NVIDIA 显卡的系统的条件 IN 子句。

SELECT  `systems`.`id` ,  `systems`.`name` ,  `specifications`.`type` 
FROM  `systems` 
JOIN specifications ON  `systems`.`id` =  `specifications`.`systemid` 
JOIN components ON  `specifications`.`componentid` =  `components`.`id` 
WHERE (
    `specifications`.`type` =  'graphics'
    AND  `components`.`brand` =  'nvidia'
    )
AND (
    `systems`.`id` IN (
          SELECT  `systems`.`id` 
          FROM  `systems` 
          JOIN specifications ON  `systems`.`id` =  `specifications`.`systemid` 
          JOIN components ON  `specifications`.`componentid` =  `components`.`id` 
     WHERE (
          `specifications`.`type` =  'cpu'
          AND  `components`.`brand` =  'amd'
          )
     )
 )

从编程上讲,我觉得它很麻烦,而且我不确定它是如何提高效率的——作为一个很大程度上是自学成才的程序员,我总是试图确保我以“正确”的方式做事。任何人都可以看到以这种方式运行它的任何问题吗?让 CodeIgniter 返回那组 ID 会更好吗?

请记住,这个问题在某种程度上被简化了,它最终将包含几个子查询——尽管站点本身永远不会承受巨大的负载。

于 2012-11-01T17:40:36.773 回答