0

我将用户 ID 与单独的逗号放在一起以MySql TABLE获得最佳用户。现在我为这个结果Example : 1,2,3使用函数:PHP explode()

$bestuser = explode(',',$bestuser);

我有另一个 MySql TABLE 用于此行的用户列表:id/name/datejoin/birthday ....

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

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

4

3 回答 3

1

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

SELECT id,name
FROM user
WHERE id IN (:yourListOfIds)

如果列表以任何方式由用户提供,请注意 SQL 注入。

于 2013-01-18T00:15:08.950 回答
0

可以在连接条件中使用 MySQL 的FIND_IN_SET()功能:

table_a JOIN table_b ON FIND_IN_SET(table_a.id_a, table_b.csv_a)

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

一个更好的解决方案是创建一个关系表:

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;

然后可以根据需要通过连接表来查询所需的数据:

SELECT   table_a.*
FROM     table_a JOIN relations USING (id_a)
WHERE    relations.id_b = ?

如果需要,甚至可以使用 MySQL 的GROUP_CONCAT()函数来获取原始 CSV:

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
于 2013-01-18T09:26:34.023 回答
0

看到这个问题,但是如果你看一下手册上的评论,你会发现很多人都在谈论爆炸。

于 2013-01-18T00:16:32.417 回答