Объедините два оператора выбора MySQL вместе - PullRequest
0 голосов
/ 22 октября 2019

У меня есть небольшая таблица в MySQL 8 со следующей схемой:

CREATE TABLE `new_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `payload` json NOT NULL,
  `type_id` int(11) NOT NULL,
  `market_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) 

и некоторыми данными

enter image description here

type_id = 7 всегда имеет referenceId значение, равное некоторому market_id.

Я получаю свои результаты в два этапа

select json_extract (payload, '$ .referenceId')из new_table где type_id = 7

, который возвращает market_ids, которые хранятся в полезной нагрузке (10000)

и после этого

выберите идентификатор из new_tableгде market_id = 10000 и type_id = 2

, что в итоге дает мне все идентификаторы, которые имеют type_id = 2, а market_id упоминается в какой-то другой записи.

Я бы хотел сделать это за один, а не за два шага. Как я могу это сделать? Мне нужны все market_id типа type_id 2, где market_id находится в полезной нагрузке json, где market_id равно 7

. Вот несколько значений:

INSERT INTO (`id`,`payload`,`type_id`,`market_id`) VALUES (1,'{\"Value\": 20}',2,10000); INSERT INTO (id, payload, type_id, market_id) VALUES (2, '{\ "Value \": 20}', 310001);INSERT INTO (`id`,`payload`,`type_id`,`market_id`) VALUES (3,'{\"Value\": 30}',4,10002); INSERT INTO (id, payload, type_id, market_id) VALUES (4, '{\ "Value \": 120}', 12,10003);INSERT INTO (`id`,`payload`,`type_id`,`market_id`) VALUES (5,'{\"Value\": 201}',2,10004); INSERT INTO (id, payload, type_id, market_id) VALUES (6, '{\ "Value \": 20, \ "referenceId \": 10000}', 7,10005);INSERT INTO (`id`,`payload`,`type_id`,`market_id`) VALUES (7,'{\"Value\": 201}',3,10000); INSERT INTO (id, payload, type_id, market_id) VALUES (8, '{\ "Value \": 20, \ "referenceId \": 10004}', 7,10008);

1 Ответ

0 голосов
/ 22 октября 2019

Я хотел бы сделать это за один, а не за два шага.

Вы можете сделать это с помощью подзапроса.

select
    id
from
    new_table
where 
    market_id = (
        select json_extract(payload, '$.referenceId')
        from   new_table
        where  type_id = 7
    )
    and type_id = 2

См. DB Fiddle дляинтерактивная демонстрация: https://www.db -fiddle.com / f / qHjmGSzwCgRSytW4wuhK1N / 0

...