MySQL查询:指定IMAGE_ID不存在时自动返回IMAGE_ID=0的数据?
问题解决:MySQL查询指定IMAGE_ID不存在时返回默认记录
表结构
pix_images_chat 表数据如下:
| ID | IMAGE_ID | USER_ID | IMAGE |
|---|---|---|---|
| 0 | 0 | 0 | no_image.jpg |
| 1 | 1000 | 1 | 1.jpg |
| 2 | 1000 | 2 | 2.jpg |
| 3 | 1001 | 3 | 3.jpg |
原查询语句
原查询通过传入IMAGE_ID参数获取对应记录:
db.query( "SELECT i.*, u.username, u.user_avatar, u.user_hash, u.user_prefix " + "FROM pix_images_chat i " + "LEFT JOIN pix_users u ON i.user_id = u.user_hash " + "WHERE i.image_id = ? " + "ORDER BY chat_date DESC", [imageID], )
当前问题:传入存在的IMAGE_ID(如1000)能正常返回对应记录;但传入不存在的IMAGE_ID(如1003)时无结果返回,需要修改查询,让这种情况下自动返回IMAGE_ID=0的记录。
修改后的查询语句
可以通过判断指定IMAGE_ID是否存在,再选择查询范围的方式实现,这里提供两种可行写法:
写法一:UNION ALL 组合查询
db.query( "SELECT i.*, u.username, u.user_avatar, u.user_hash, u.user_prefix " + "FROM pix_images_chat i " + "LEFT JOIN pix_users u ON i.user_id = u.user_hash " + "WHERE i.image_id = ? " + "UNION ALL " + "SELECT i.*, u.username, u.user_avatar, u.user_hash, u.user_prefix " + "FROM pix_images_chat i " + "LEFT JOIN pix_users u ON i.user_id = u.user_hash " + "WHERE i.image_id = 0 " + "AND NOT EXISTS (SELECT 1 FROM pix_images_chat WHERE image_id = ?) " + "ORDER BY chat_date DESC", [imageID, imageID], )
逻辑说明
- 第一部分保持原查询逻辑,获取指定
IMAGE_ID的记录; - 第二部分仅当指定
IMAGE_ID不存在时,才返回IMAGE_ID=0的默认记录; UNION ALL合并两个查询结果,避免重复数据(指定IMAGE_ID存在时,第二部分无输出);- 最后统一按
chat_date排序,保证结果顺序一致。
写法二:OR 条件结合子查询(更简洁)
db.query( "SELECT i.*, u.username, u.user_avatar, u.user_hash, u.user_prefix " + "FROM pix_images_chat i " + "LEFT JOIN pix_users u ON i.user_id = u.user_hash " + "WHERE i.image_id = ? OR (i.image_id = 0 AND NOT EXISTS (SELECT 1 FROM pix_images_chat WHERE image_id = ?)) " + "ORDER BY chat_date DESC", [imageID, imageID], )
逻辑说明
- 用
OR同时包含两种查询条件:要么匹配指定IMAGE_ID,要么匹配默认IMAGE_ID=0且指定ID不存在; - 由于默认ID(0)不会和业务ID重复,无需额外加
DISTINCT去重; - 写法更紧凑,执行效率和第一种相当。
内容的提问来源于stack exchange,提问作者Kijupo
相关产品推荐
相关产品推荐

