You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:50:26