SQL IN (оператор SELECT), где соответствующий оператор SELECT является массивом, возможно ли это? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть две базы данных, с которыми я хотел бы сравнить результаты. У одного из них есть столбец, в котором хранится массив информации для сопоставления с другой таблицей.

table1
 ------------------------------------
| collection_id |        items_array |
 ------------------------------------
|          123  | ['item1' ,'item2'] |
 ------------------------------------

table2
 ---------------------
|  user_id |  item_id |
 ---------------------
|        2 |    item1 |
|        1 |    item2 | 
 ---------------------

Я хотел бы сделать SQL-запрос, который будет использовать table1.collection_id для получения столбца table1.items_array, а затем получить каждый table2.user_id, где table2.item_id находится в массиве table1.items_array. Мое выражение сейчас (в PDO):

SELECT
    table2.user_id
FROM table2
WHERE table2.item_id IN (
    SELECT table1.items_array
    FROM table1
    WHERE table1.collection_id = ?
)

Таким образом, идея заключается в том, что оператор IN должен быть массивом из столбца items_array. Однако это не работает. Я попытался отформатировать массив в столбце items_array по-другому, чтобы увидеть, является ли это синтаксической ошибкой. Я пробовал следующее:

['item1', 'item2']
['item1','item2']
'item1', 'item2'

Но, похоже, ни один из них не достиг желаемого результата.

Возможно ли вообще делать то, что я надеюсь сделать, или я должен стремиться хранить информацию другим способом? Я хотел бы сохранить его в виде массива, потому что после размещения массива пользователю больше никогда не придется обновлять или сопоставлять массив, поэтому я не думаю, что возникнет проблема нормализации.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Попробуйте использовать Like вместо IN.

with table2 as 
(
select item_id ='item1' union select 'item2' union select 'item3' union select 'item4' 
)
    select item_id from table2 where item_id like  '%' +
    (
    select items_array from
        (
        select items_array = '[''item1'',''item2'']' 
        ) table1
    ) 
0 голосов
/ 29 марта 2019

Попробуйте запрос ниже


SELECT @items := items_array FROM table1 WHERE collection_id = 123;

SELECT table2.user_id
FROM table2
WHERE table2.item_id IN  ( @items );

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...