在mysql中连接两个表并获取记录

在mysql中连接两个表并获取记录,mysql,phpmyadmin,Mysql,Phpmyadmin,我有两个表“联系人”和“用户”。存储数据的用户表以“,”分隔。需要将“联系人”列中的数据与“联系人”表中的数据区分开来。并且需要加入“用户”表,并获取记录 Contacts Table -------------------------- id | user_Id | contats -------------------------- 1 | 2147483647 | 90123456789,90123456789,90123456789,90123456789 2

我有两个表“联系人”和“用户”。存储数据的用户表以“,”分隔。需要将“联系人”列中的数据与“联系人”表中的数据区分开来。并且需要加入“用户”表,并获取记录

Contacts Table
--------------------------
id |    user_Id      | contats
--------------------------
1  |   2147483647    | 90123456789,90123456789,90123456789,90123456789
2  |   2147483647    | 90123456789,90123456789,90123456789,90123456789
3  |   919444894154  | 90123456789,90123456789,90123456789,90123456789

Users Table
-----------------------------
id | username | email                  | phone
-----------------------------
1  | bhavan   | bhavanram93@gmail.com  | 90123456789
2  | bhavan   | bhavanram93@gmail.com  | 90123456789
3  | prince   | prince@gmail.com       | 1234567980
4  | bhavan   | bhavanram93@gmail.com  | 90123456789
5  | hello    | hello@gmail.com        | 1234567890
6  | bhavan   | bhavanram93@gmail.com  | 90123456789

您的表
联系人
不应以这种方式构建

由于您希望1个
Users
表包含有关用户的所有数据,1个
Contacts
表包含不同用户之间的链接,因此您更希望采用这种表结构:

联系人表格

id | user_id | contact_id
-------------------------
1  | 1       | 2
2  | 1       | 3
3  | 2       | 3
这将允许您执行以下操作:

SELECT *
FROM Users
JOIN Contacts ON (Users.id = Contacts.contact_id)
WHERE Contacts.user_id = 1
这将返回用户1的联系人的所有数据


您当前的结构非常混乱,与灵活相反。

您的表
联系人不应以这种方式构建

由于您希望1个
Users
表包含有关用户的所有数据,1个
Contacts
表包含不同用户之间的链接,因此您更希望采用这种表结构:

联系人表格

id | user_id | contact_id
-------------------------
1  | 1       | 2
2  | 1       | 3
3  | 2       | 3
这将允许您执行以下操作:

SELECT *
FROM Users
JOIN Contacts ON (Users.id = Contacts.contact_id)
WHERE Contacts.user_id = 1
这将返回用户1的联系人的所有数据


您当前的结构非常混乱,这与灵活性正好相反。

您应该按照Steve的建议将数据库重组为规范化格式

但如果你不能:

SELECT *
FROM Users
JOIN Contacts 
  ON CONCAT(',', Contacts.contacts, ',') like
     CONCAT('%,', Users.phone, ',%')
WHERE Contacts.user_id = 1
这样做的目的是将联系人转换为

,    <numbers>    ,
,90123456789,90123456789,90123456789,90123456789,
注意:这种方法不能使用任何索引,因此在许多情况下会有很差的性能
排。如果按1k-10k的顺序排列,则行数可以。你需要考虑重构你的DB。

< P>你应该按照史提夫的建议将你的DB重构成标准化的格式。p> 但如果你不能:

SELECT *
FROM Users
JOIN Contacts 
  ON CONCAT(',', Contacts.contacts, ',') like
     CONCAT('%,', Users.phone, ',%')
WHERE Contacts.user_id = 1
这样做的目的是将联系人转换为

,    <numbers>    ,
,90123456789,90123456789,90123456789,90123456789,
注意:这种方法不能使用任何索引,因此在许多情况下会有很差的性能
排。如果按1k-10k的顺序排列,则行数可以。超过你需要考虑重构你的DB。< /P>检查这里解释得很好-把表和数据作为文本检查,这里解释得很好-把表和数据作为文本感谢答辩,我们需要从“联系人”栏中删除“”(逗号)“联系人”表,对吗?那是我想要的。是的,绝对。例如,在您的
联系人
列中的示例中,有
“919444894154919446546”
,此时您应该有两行,而不是按照与我的示例中相同的模式。提供了一个示例,说明如何获取逗号分隔的列表并从中生成行。感谢您的回复,我们需要从“联系人”表的“联系人”列中删除“”(逗号),对吗?那是我想要的。是的,绝对。例如,在您的
联系人
列中的示例中,有
“919444894154919446546”
,此时您应该有两行,而不是按照与我的示例中相同的模式。提供一个示例,说明如何获取逗号分隔的列表并从中生成行。