我正在尝试生成单个查询,并且真的坚持如何使用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来做。
非常困惑,完全没有想法,请尽可能帮助。
答案 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列表。这些应存储在适当的联结表中。