虽然我可以让联接起作用,但它并不会返回最低限度的交易。结果应该是手机价格最低,每月最低成本。目前我可以获得最低的手机价格,但不是每月最低的成本和同样最低的月度成本,而不是最低价格的手机。
我有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(免费),与其相当的每月费用。任何帮助都是最受欢迎的。
答案 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
直接运行此查询