php - 选择加入 MYSQL
问题描述
我有 2 张桌子user
和userdata
.
一旦客户购买了产品,它将插入到表userdata
和user
.
在user
表中,产品 id 记录在user
. buyid
以“id,id,id,id,id”的形式。
例如:“23、24”。所以我试图通过使用这些查询从产品中获取所有具有 id ( 23, 24 ) 的行
SELECT * FROM `userdata`,`user` WHERE `userdata`.`id` IN (`user`.`buyid`);
查询返回 1 行产品,即 id=23
SELECT * FROM `user` INNER JOIN `userdata` ON `userdata`.`id` IN (`user`.`buyid`);
这也只返回 1 行 id 为 23 的产品。
预期结果每一行都返回:
user.id | user.name | user.contact | product.id | product.name
1 | nazmi | 99999 | 23 | A
1 | nazmi | 99999 | 24 | B
解决方案
修复你的数据模型!在字符串中存储 id 列表是不好的,不好的,不好的:
- 你的 id 是一个整数。它应该存储为数字,而不是字符串。
- 您的 id 指的是另一个表。它应该正确声明外键关系。
- 一列应包含一列。
- SQL 有一种存储列表的好方法。真的很强大。它被称为“表”而不是“字符串列”。
- SQL 中的字符串处理能力很差。
- 具有此类数据结构的查询无法利用索引和分区。
有时,您会被其他人的非常非常非常糟糕的决定所困扰。MySQL 提供了一个很好的功能(在我看来太好了)来帮助:
SELECT *
FROM user u JOIN
userdata ud
ON find_in_set(ud.id, u.buyid) > 0;
如果你的 id 列表中有空格,那么你需要去掉它们。分隔符必须是逗号。
SELECT *
FROM user u JOIN
userdata ud
ON find_in_set(ud.id, replace(u.buyid, ' ', '')) > 0;
推荐阅读
- .net - Restful API 在一个 HTTP 请求中发布文件和元数据
- android - 在调试器中启动应用程序时 Android 设备重置
- sql-server - 恢复一个 1.2GB 的 bak 文件,但数据库大小没有那么大
- powershell - 如何使用 Powershell 命令 Set-Service SwitchAccount 将 Windows 帐户更改为本地系统帐户
- c# - C# Castle Windsor 使用工厂时不注入 NLog 实例
- python - 为什么用不同的 __init__ 代码继承相同的类?盈透证券 API
- ios - 如何设置快速编译器版本?
- typescript - 如何为 Typescript 明确指定 node_modules 目录
- python - 在 python 虚拟环境 mariadb_config 命令中找不到,没有虚拟环境它可以工作吗?
- java - Springboot自定义选择查询返回没有找到能够从类型转换的转换器