【问题标题】:Codeigniter mysql query joining 2 values across 3 tablesCodeigniter mysql查询连接3个表中的2个值
【发布时间】:2014-10-11 18:29:41
【问题描述】:

虽然我可以让连接工作,但它不会返回可能的最低交易。结果应该是最低的手机价格和最低的每月成本。目前我可以得到最低的手机价格,但不是最低的月费,同样最低的月费,但不是最低价的手机。

我有 3 张桌子 DEALS、TARIFFS 和 HANDSETS。当客户访问制造商产品列表页面时,它会加载与该制造商相关的所有产品(在大多数情况下大约 40 种产品)。我想要的是为每种产品加载最便宜的交易。关税表有超过 4000 条记录。手机表有超过 3000 条记录。 Deals 表有超过 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(免费),每月的成本也是如此。任何帮助都将受到欢迎。

【问题讨论】:

    标签: mysql codeigniter join


    【解决方案1】:

    根据您的查询,您在没有任何聚合函数的情况下滥用 Mysql 的 GROUP BY 扩展名,这将导致您的查询以您的查询为例,返回组中不存在的列的不确定结果,列 t.monthly_cost, d.handset_cost 值是不确定您是否专门从每部手机的交易表中选择最小行,那么您可以使用以下查询

    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
    

    See Demo

    对于活动记录查询,很难复制上述(子选择)查询,您可以通过$this->db->query('your query')直接运行此查询

    【讨论】:

    • 抱歉这么久才回来,我已经尝试过您的解决方案并且确实有效,但是由于可用的交易数量超时,您是否可以想到其他方法,我应该考虑查看架构。
    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多