Codeigniter mysql查询在3个表中连接2个值

时间:2014-10-11 18:29:42

标签: mysql codeigniter join

虽然我可以让联接起作用,但它并不会返回最低限度的交易。结果应该是手机价格最低,每月最低成本。目前我可以获得最低的手机价格,但不是每月最低的成本和同样最低的月度成本,而不是最低价格的手机。

我有3张桌子DEALS,TARIFFS和HANDSETS。当客户访问制造商产品列表页面时,它会加载与该制造商相关的所有产品(在大多数情况下约为40个产品)。我想要的是加载每种产品最便宜的交易。关税表有超过4000条记录。手机表有超过3000条记录。交易表有超过100万条记录。

下面列出了3个表格及相关列:

                  Handset Table
          ==================================
                  id    |    manufacturer_id
          -----------------------------------
                 100              1


                   Deals Table
==================================================
 tariff_id    |    handset_id    |    handset_cost
--------------------------------------------------
     15             100              44.99
     20             100             114.99


                 Tariffs Table
          ==============================
                 id    |    monthly_cost
          ------------------------------
                15           12.50
                20            7.50

这是查询

$this->db->select('h.name, t.monthly_cost, d.handset_cost');
        $this->db->from('aff_deals d');
        $this->db->join('aff_tariffs t', 't.id = d.tariff_id', 'inner');
        $this->db->join('aff_handsets h', 'h.id = d.handset_id', 'inner');

        if (isset($manuid)) {
            $this->db->where('h.manufacturer_id', $manuid);
        }

        $this->db->order_by('d.handset_cost ASC');
        $this->db->order_by('t.monthly_cost ASC');

        $this->db->group_by('h.name');

        $query = $this->db->get();
        $result = $query->result();

不幸的是,当我需要44.99英镑和12.50英镑的时候,手机成本为114.99英镑,每月成本为7.50英镑。上面的例子是一个简单的快照。我已经尝试过MIN(d.handset_cost),子查询但无法获得所需的结果。不知何故,我需要能够获得最低价格的手机,即使它是0.00(免费),与其相当的每月费用。任何帮助都是最受欢迎的。

1 个答案:

答案 0 :(得分:1)

根据您的查询,您错误地使用了Mysql的GROUP BY扩展而没有任何聚合函数,这将导致您的查询返回组中不存在的列的不确定结果,以查询为例,列{{1如果您具体从每个手机的交易表中选择最小行,那么您的价值是不确定的,那么您可以使用以下查询

t.monthly_cost, d.handset_cost

See Demo

对于有效记录查询,很难在上面复制(子选择)查询,您可以通过SELECT h.name, t.monthly_cost, d.handset_cost FROM aff_deals d INNER JOIN (SELECT handset_id,MIN(handset_cost) handset_cost FROM aff_deals GROUP BY handset_id) dd ON d.handset_id = dd.handset_id AND d.handset_cost = dd.handset_cost INNER JOIN aff_tariffs t ON t.id = d.tariff_id INNER JOIN aff_handsets h ON h.id = d.handset_id WHERE h.manufacturer_id =1 ORDER BY d.handset_cost ASC,t.monthly_cost ASC 直接运行此查询