带有IN()子句和列名数据的Sqlite子查询

osh3o9ms  于 2023-03-30  发布在  SQLite
关注(0)|答案(1)|浏览(150)

我有两张table:
“songs”:歌曲ID,标题,文本,liryc -作者ID,例如12 -一个作者具有ID 12,或46,60-因为有两个liryc的作者。
第二个,“authors”是作者的id,名字,姓氏表。事情是FTS搜索标题并返回:id,title和autor的名字在一个查询:

SELECT title,
       (SELECT group_concat(name ||''|| surname, ', ')
        FROM authors
        WHERE id IN (liryc)
       ) AS lirycist
FROM songs
WHERE title MATCH :q

因为有例如IN(46,60)手写,结果是好的-两个名字由逗号分隔。但是如果我使用列名- IN(liryc)-并且有两个或更多的id,例如46,60,32- '46,60,32',因为我理解它传递-在thousends CAST trys之后没有结果或只有一个名字。像:

... id IN(CAST(liryc) AS INT)) AS lirycist ...

... id IN(CAST(liryc) AS TEXT,BLOB,VARCHAR,etc...)) AS lirycist ...

没有PHP函数:

function sliceit($ids){  
return implode(",",array_map('intval',explode(',', $ids)));  
}

... id IN(sliceit(liryc)) AS lirycist ...

... id IN(CAST(sliceit(liryc) AS ALL_POSIBILLITIES) AS lirycist ...

返回一个结果或无结果...
有什么建议吗?

ktca8awb

ktca8awb1#

由于向IN()子句中传递值并不容易,因此替代方法是使用多个ORLIKE。
--列liryc可能是12或23,45,345

SELECT title,
   (SELECT group_concat(name ||''|| surname, ', ')
    FROM authors
    WHERE id = liryc 
    OR liryc LIKE '' || id || ',%' 
    OR liryc LIKE '%,'||id||'' 
    OR liryc LIKE '%,'||id||',%'
   ) AS lirycist
FROM songs
WHERE title MATCH :q

或者使用SQLite替代MySQL FIND_IN_SET:
http://www.mobileonly.com/sqlite-equivalent-zu-mysql-find_in_set/

SELECT title,
   (SELECT group_concat(name ||''|| surname, ', ')
    FROM authors
    WHERE LIKE('%,'||id||',%',','||liryc||',')
   ) AS lirycist
FROM songs
WHERE title MATCH :q

哪些接缝要快一点(肯定要短一些)

','||liryc||','

在列 liryc value的开头和结尾创建空的“values/strings”。

相关问题