加入vs多个选择

时间:2013-05-21 00:24:26

标签: php mysql

我正在做一个相当简单的系统,用户可以通过选项类型搜索找到计算机。我想按品牌,型号和“选项”进行搜索。

基本上我在这个场景中有5个表 -

  1. 品牌
  2. 模型
  3. 选择
  4. options_group
  5. 选项
  6. 选择表是一个包含以下内容的多列查找表:

    • brand_id
    • MODEL_ID
    • options_group_id

    options_group表是一个查找表,其中包含“选项组”的ID和每个option_id的条目。

    基本上,options_group表允许许多条目具有相同的选项组,而不会多次存储它。

    右。所以。我想选择生成表格的特定部分选择:

    • 品牌
    • 模型
    • 选项

    其中“options”基于options_group生成。

    我的问题是:我是否使用多个select语句执行此操作,我首先从选择表中选择,然后使用options_group进行第二次选择并获取每行的所有选项,或者我是否执行此操作一个连接并得到一个有很多行的表?

    在你提出建议之前,我没有发现SO上的任何其他答案都在回答这个问题。

    还是有其他更好的方法吗?我读到连接比多个选择快几个数量级,但最后解析它可能需要更多时间。

2 个答案:

答案 0 :(得分:1)

使用select distinct的单个语句清除重复项。作为SQL基础的关系 - 微积分/关系 - 代数会自动消除作为project运算符一部分的重复项。但是,SQL默认情况下不会这样做,并要求您使用distinct。因为基础关系理论鼓励单一陈述,并且它完全符合运算符,我推荐它作为最佳实践。

有两个表parent (id)child (id, parent_id, property)执行select distinct parent.id from parent join child on parent.id = child.id where child.property in ("X", "Z");

答案 1 :(得分:1)

由于您要求良好实践,我会抛出这样的事实,即这不一定是仅限db的解决方案。在应用程序层或类似memcached等的情况下缓存静态/查找数据(声音模型和/或部件不会经常更改)是一种很好的做法,它会为您节省连接并减少结果集大小。