首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP :爆炸和连接组合

PHP :爆炸和连接组合
EN

Stack Overflow用户
提问于 2013-01-18 00:01:22
回答 3查看 1.8K关注 0票数 0

为了获得最佳用户,我在MySql TABLE中添加了带有单独逗号的用户id。Example : 1,2,3现在我使用PHP explode()函数来实现这个结果:

代码语言:javascript
复制
$bestuser = explode(',',$bestuser);

我有另一个MySql表,用于这一行的用户列表:id/name/datejoin/生日会.

现在,我需要使用MySql联接方法打印最佳用户的名称。实际上,我的意思是如何将爆炸结果与其他MySql表结果组合起来。

注意到:我知道这个设计(1,2,3)很糟糕,但我别无选择。

EN

回答 3

Stack Overflow用户

发布于 2013-01-18 00:15:08

您可以编写一个SQL查询来执行此操作:

代码语言:javascript
复制
SELECT id,name
FROM user
WHERE id IN (:yourListOfIds)

如果列表是以用户提供的任何方式提供的,请小心SQL注入。

票数 1
EN

Stack Overflow用户

发布于 2013-01-18 00:16:32

请参阅这个问题,但是如果您查看手册上的评论,您会发现很多人都在谈论爆炸。

票数 0
EN

Stack Overflow用户

发布于 2013-01-18 09:26:34

可以在联接条件中使用MySQL的FIND_IN_SET()函数:

代码语言:javascript
复制
table_a JOIN table_b ON FIND_IN_SET(table_a.id_a, table_b.csv_a)

但是(根据我上面的注释中的警告),这个操作效率非常低,因为MySQL必须完全扫描两个表。

一个更好的解决办法是建立一个关系表:

代码语言:javascript
复制
CREATE TABLE relations (
  FOREIGN KEY (id_a) REFERENCES table_a (id_a),
  FOREIGN KEY (id_b) REFERENCES table_b (id_b)
) SELECT table_a.id_a, table_b.id_b
  FROM   table_a JOIN table_b
      ON FIND_IN_SET(table_a.id_a, table_b.csv_a);

ALTER TABLE table_b DROP csv_a;

然后,可以根据需要加入表来查询所需的数据:

代码语言:javascript
复制
SELECT   table_a.*
FROM     table_a JOIN relations USING (id_a)
WHERE    relations.id_b = ?

如果愿意,甚至可以使用MySQL的GROUP_CONCAT()函数获得原始的CSV:

代码语言:javascript
复制
SELECT   table_b.id_b, GROUP_CONCAT(relations.id_a) AS csv_a
FROM     table_b JOIN relations USING (id_b)
WHERE    ...
GROUP BY table_b.id_b
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14390360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档