使用MySQL CASE判断用户购买记录存在性返回空数组,求解决方法
解决指定用户是否存在购买记录的查询问题
你的查询使用内连接(JOIN)关联purchase和users表,当目标user_id在purchase表中无对应记录时,内连接不会返回任何结果,因此得到空数组。以下是几种可行的实现方式:
方式一:左连接(从users表出发关联)
const getUserPurchase = async(userId) => { const purchase = await myDataSource.query( `SELECT u.id, CASE WHEN p.user_id IS NOT NULL THEN '1' ELSE '0' END AS userPurchase FROM users u LEFT JOIN purchase p ON p.user_id = u.id WHERE u.id = ? LIMIT 1`, [userId], ); return purchase; };
从users表发起左连接,确保即使用户无购买记录也能返回基础用户信息,通过CASE判断关联的purchase记录是否存在,LIMIT 1保证仅返回单条结果。
方式二:使用EXISTS子查询
const getUserPurchase = async(userId) => { const purchase = await myDataSource.query( `SELECT ? AS id, CASE WHEN EXISTS (SELECT 1 FROM purchase WHERE user_id = ?) THEN '1' ELSE '0' END AS userPurchase`, [userId, userId], ); return purchase; };
EXISTS子查询会直接检查purchase表中是否存在指定user_id的记录,存在则返回true,否则返回false,对应输出1或0。若仅需判断存在性,无需关联users表时,这种方式更高效。
方式三:利用COUNT聚合函数
const getUserPurchase = async(userId) => { const purchase = await myDataSource.query( `SELECT ? AS id, IF(COUNT(*) > 0, '1', '0') AS userPurchase FROM purchase WHERE user_id = ?`, [userId, userId], ); return purchase; };
通过COUNT(*)统计符合条件的记录数,若数量大于0则说明存在购买记录,返回1,否则返回0。这种方式即使无匹配记录,也会返回一条结果,不会出现空数组。
内容的提问来源于stack exchange,提问作者ggyoE
相关产品推荐
相关产品推荐

