【问题标题】:JOIN on array of ids in sql加入 sql 中的 id 数组
【发布时间】:2012-10-28 04:01:10
【问题描述】:

我有三张桌子: 表 1 合同

-------------------
id  |  contract_name
--------------------
1      test name
2      test name 2
2      test name 3
4      test name 4

表 2 间

-------------------
id  |  room_name
--------------------
1      test name
2      test name 2
2      test name 3
4      test name 4

表 3 促销

----------------------------------
 id  |  contracts_id  |   rooms_id
----------------------------------
 1          1,3            1,3,4
 1          2              1,2,3

不,我正在尝试进行内部连接,以根据保存在数据库中的数组中的 id 来获取合同和房间的名称。我知道这根本不理想,但我无法更改数据库设置。所以这就是我想对我的查询做的事情,但显然这是不可能的。有没有人知道我该如何做到这一点?

mysql_query("SELECT pb.*, c.contract_name, r.room_name FROM promo_blackouts AS pb
INNER JOIN contracts as c ON c.contract_id IS IN pb.contracts_id
INNER JOIN rooms as r ON r.room_id IS IN pb.rooms_id 
WHERE pb.promo_id = '$promo_id'") or die(mysql_error());

【问题讨论】:

  • 有什么问题? mysql 是否抱怨列名重复,或者您只是无法按名称访问值(即$row['id'],因为它不是唯一的)?如果可能,请发布错误消息。
  • 呃,太乱了。您必须解析字段,用逗号分隔它们。 mysql 中没有拆分函数,但您可以使用 substr_index 和一系列循环编写自己的函数。您的示例代码看起来像 PHP - 您是否考虑过在 PHP 中进行解析并执行几个查询?
  • 我很惊讶还没有人提到这一点:这不是一个最佳的数据库设计。您可能已经知道这一点,但如果您不知道,您应该对规范化进行一些研究。

标签: mysql sql arrays join


【解决方案1】:

你在寻找这样的东西吗?:

SELECT DISTINCT
    contract_name,
    room_name
FROM
    promos
INNER JOIN
    contracts ON FIND_IN_SET(contracts.id, contract_id) != 0
INNER JOIN
    rooms ON FIND_IN_SET(rooms.id, room_id) != 0
WHERE
    promos.id = 1

【讨论】:

  • 完美运行! “room_id”和“contract_id”是逗号分隔的外键......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2013-11-22
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多