我有两个表“联系人”和“用户”。用户表以“,”分隔存储数据。需要在“通讯录”列中的“通讯录”列中显示不同的数据。并且需要加入“用户”表,并获取记录。
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
答案 0 :(得分:1)
您的表Contacts
不应该以这种方式构建。
由于您希望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 :(得分:1)
您应该将您的数据库重组为标准格式,如史蒂夫建议的那样。
但如果你不能:
SELECT *
FROM Users
JOIN Contacts
ON CONCAT(',', Contacts.contacts, ',') like
CONCAT('%,', Users.phone, ',%')
WHERE Contacts.user_id = 1
您的想法是将联系人转换为
, <numbers> ,
,90123456789,90123456789,90123456789,90123456789,
并尝试与
匹配 %,90123456789,%
请注意,此方法无法使用任何索引,因此会对许多人产生不良影响 行。如果你的顺序是1k-10k,那么可能没问题。不仅如此,您还需要考虑重构数据库。