Mysql 即使在左连接时显示字段,也会给出空值
我有三个表:Mysql 即使在左连接时显示字段,也会给出空值,mysql,sql,left-join,Mysql,Sql,Left Join,我有三个表:产品,订单详情,订单 我想在一个查询中加入它们,显示用户购买的所有产品 这是我的密码: SELECT products.id AS id, products.kode AS kode, products.sub_kode AS sub_kode, products.nama AS nama, products.barcode AS barcode, products.harga AS harga, IFNULL
产品
,订单详情
,订单
我想在一个查询中加入它们,显示用户购买的所有产品
这是我的密码:
SELECT products.id AS id,
products.kode AS kode,
products.sub_kode AS sub_kode,
products.nama AS nama,
products.barcode AS barcode,
products.harga AS harga,
IFNULL(products.keterangan_kemasan, ' ') AS keterangan_kemasan,
IFNULL(products.keterangan_ukuran ,' ') AS keterangan_ukuran,
SUM(IFNULL(order_details.jumlah_pesanan_akhir,0)) AS jumlah,
IFNULL(order_details.jumlah_pesanan_akhir,0) AS jumlah_beli,
orders.idmember AS member
FROM products LEFT JOIN (orders,order_details)
ON (orders.id = order_details.idorder
AND order_details.product_kode = products.kode
AND order_details.product_subkode = products.sub_kode)
WHERE products.nama LIKE '%asdu%'
AND IFNULL(orders.idmember, 21376) = 21376
GROUP BY products.kode, products.sub_kode
ORDER BY IFNULL(order_details.jumlah_pesanan_akhir,0) DESC,
products.nama ASC
LIMIT 30;
发生的情况是,当客户从不购买该商品时,该商品将不会显示。同时,我希望他们能被展示出来
如果我将其从查询中删除
AND IFNULL(orders.idmember, 21376) = 21376
一切都会好起来的。但它会显示其他人的订单历史。因此,如果我理解,您需要所有看起来像
%asdu%
的产品,并且您想知道客户21376
是否购买了这些产品
用户id必须是LEFT JOIN子句的一部分,否则它将被过滤掉
SELECT products.id AS id,
products.kode AS kode,
products.sub_kode AS sub_kode,
products.nama AS nama,
products.barcode AS barcode,
products.harga AS harga,
IFNULL(products.keterangan_kemasan, ' ') AS keterangan_kemasan,
IFNULL(products.keterangan_ukuran ,' ') AS keterangan_ukuran,
SUM(IFNULL(order_details.jumlah_pesanan_akhir,0)) AS jumlah,
IFNULL(order_details.jumlah_pesanan_akhir,0) AS jumlah_beli,
orders.idmember AS member
FROM products
LEFT JOIN order_details
ON order_details.product_kode = products.kode
AND order_details.product_subkode = products.sub_kode
LEFT JOIN orders
ON orders.id = order_details.idorder
AND orders.idmember = 21376
WHERE products.nama LIKE '%asdu%'
GROUP BY products.kode, products.sub_kode
ORDER BY IFNULL(order_details.jumlah_pesanan_akhir,0) DESC,
products.nama ASC
LIMIT 30;
我已经重写了连接,以明确什么是连接什么。我建议您重新考虑是否需要将其限制为1个查询。正如你所注意到的,很难让它做你想做的事情 两个或三个查询更容易理解。你现在正在做这件事,如果你在一年后回顾一下,这件事看起来会很糟糕。此外,如果其他人需要纠正这一点,他们将有一个困难的时间 我的建议是:
SELECT * FROM users WHERE id=123
// With that result:
SELECT * FROM orders WHERE user_id=$user['id']
// While this loops:
SELECT * FROM order_details WHERE orderid=$orders['id']
对于数据库来说可能更快,但联接速度较慢,特别是对于大型表。它将锁定表,这会使其他用户的速度变慢。而且,分组也没有帮助非常感谢,我不知道join会是这样,我的意思是,我从来没有下过命令。idmember=21376件事…:D