mysql问题使用json字符串中的join来获取一个唯一值

时间:2015-08-12 00:21:26

标签: mysql json join

我正在尝试生成单个查询,并且真的坚持如何使用mysql设置它。

我有一个表 tblListings

----------------------------------------------
| id | name |  photo_order                    |
----------------------------------------------
| 1  | mike | ["119","122","118","120","121"] |
| 2  | john | ["123"]                         |
| 3  | bill |                                 |
----------------------------------------------

和第二张表 tblImages 这样的照片

----------------------------------------------
| id | listing_id |  image_name              |
----------------------------------------------
| 1  | 119        | image1.jpg               |
| 2  | 122        | image2.jpg               |
| 3  | 123        | image3.jpg               |
| x  | xxx        | xxxxxetc.jpg             |
----------------------------------------------

我想要完成的是从tblListings中选择所有记录,然后将其与“photo_order”json数组的初始值中的单个匹配图像名称(1个结果)连接起来。我相信这会使用join,但我对如何实现这一点非常困惑。

例如,对于记录ID 1,它将返回tblListings.id = 1,name = mike,然后因为photo_order第一个值为119,它将从tblImages选择具有119的listing_id的记录并将其加入到结果中。

初始行的最终结果是:

tblrecords.id  |  name | image_name |
-------------------------------------
 1             | mike  | image1.jpg |

我知道这是我在PHP中可以玩的东西,但输出给我带来了麻烦,最好用mysql来做。

非常困惑,完全没有想法,请尽可能帮助。

2 个答案:

答案 0 :(得分:0)

使用MySQL中的字符串并不总是最佳的性能解决方案。

但是,如果您无法更改数据库结构或应用程序,或者即使您不关心执行时间,也可以执行以下操作:

SELECT 
  i.*
FROM tblImages i JOIN (
  SELECT
    id,
    TRIM(LEADING '["' FROM SUBSTRING_INDEX(photo_order, '"', 2)) AS image_id 
  FROM tblListings
) l ON i.listing_id = l.image_id;

诀窍在于:TRIM(LEADING '["' FROM SUBSTRING_INDEX(photo_order, '"', 2))。通过此操作,您可以在第二个"之前开始获取所有内容,例如["119。然后从头开始修剪["。最后,您可以使用连接条件中的剩余数字。

答案 1 :(得分:0)

如果您想要匹配第一个号码,可以进行如下连接:

select i.*
from tbllistings l join
     tblimages i
     on l.photo_order = concat('[", i.listing_id, '"%');

那就是说,你不应该在JSON数组中存储id列表。这些应存储在适当的联结表中。