#mysql #sql #join #subquery #snowflake-cloud-data-platform
Вопрос:
У меня есть две таблицы; таблица журнала, которая связана с таблицей издателя через столбец Publisher_ID, общий для обеих таблиц.
В таблице журналов есть столбец для категорий в зависимости от того, на чем сосредоточено содержание этого конкретного журнала (например, мода, знаменитости, автомобили, спорт, охота и т. Д.). У многих издателей есть журналы, охватывающие множество категорий, но некоторые-только несколько.
Я хочу запустить запрос, в котором я выберу 100 лучших названий журналов, которые находятся в категории «автомобили», а затем присоединю эти журналы к связанным с ними издателям, но затем выберу остальные названия этих издателей, независимо от того, являются ли эти журналы автомобилями или нет.
т. е. я хочу выбрать все журналы от издателей, которые объединены из первых 100 выбранных журналов, ориентированных на автомобили.
В результате я надеюсь на все колонки из журнала и связанных с ними примкнул издатель столбцы таблицы, и должна принести гораздо больше, чем 100 журналов, в том числе в категориях больше, чем просто «автомобили» , но только от издателей, которые имеют как минимум один журнал название, что находится в «легковую» категорию, исключая какие-либо издательства (и соответствующих журналов), который не публиковать автомобильных журналов.
Попытка запроса, с которой я работал, находится здесь:
SELECT Magazine.*,Publisher.*
FROM
Magazine
INNER JOIN
Publisher
ON
Magazine.publisher_id = publisher.publisher_id
WHERE (SELECT Magazine.category
FROM Magazine
WHERE Magazine.category = 'cars'
LIMIT 100)
;
результат, который я получил, был таким
Single-row subquery returns more than one row.
Извините за изложение, но я хотел быть как можно более описательным в том, чего я пытаюсь достичь.
Ответ №1:
Вы не говорите, как вы выбираете 100 журналов. Но для 100 произвольных журналов вы можете использовать IN
или EXISTS
:
SELECT m.*, p.*
FROM Magazine m INNER JOIN
Publisher p
ON m.publisher_id = p.publisher_id
WHERE p.publisher_id IN (SELECT m2.publisher_id
FROM Magazine m2
WHERE m2.category = 'cars'
LIMIT 100
);
Комментарии:
1. Таким образом, этот запрос выполняется, но содержит только 100 строк. Я надеялся, что независимо от 100 лучших журналов, в которых есть категория «автомобили», она затем включит все связанные журналы от издателей, связанных с этим подзапросом.
2. @JLuu . . . Это имеет смысл. Сравнение должно быть по идентификатору издателя, а не по идентификатору журнала.