首页 > 解决方案 > 选择加入 MYSQL

问题描述

我有 2 张桌子useruserdata.

一旦客户购买了产品,它将插入到表userdatauser.

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

标签: phpmysqlsqljoin

解决方案


修复你的数据模型!在字符串中存储 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;

推荐阅读