Mysql получить результаты из одной таблицы на основе другой с объединением - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть 2 таблицы:

$sql = "CREATE TABLE $media_table (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `type` varchar(50) NOT NULL,
            `title` varchar(255) DEFAULT NULL,
            `description` varchar(2000) DEFAULT NULL,
            `playlist_id` int(11) NOT NULL,
            PRIMARY KEY (`id`),
            INDEX `playlist_id` (`playlist_id`),
        ) $charset_collate;";

$sql = "CREATE TABLE $taxonomy_table (
                `id` int(11) NOT NULL AUTO_INCREMENT,
                `type` varchar(10) NOT NULL,
                `title` varchar(500) NOT NULL,
                `media_id` int(11) NOT NULL,
                `playlist_id` int(11) NOT NULL,
                PRIMARY KEY (`id`),
                INDEX `media_id` (`media_id`),
                CONSTRAINT `mvp_taxonomy_ibfk_1` FOREIGN KEY (`media_id`) REFERENCES {$media_table} (`id`) ON DELETE CASCADE ON UPDATE CASCADE
            ) $charset_collate;";

Допустим, я хочу выбрать все строки из media_table, где playlist_id = 5 и title из taxonomy_table = "sport, football".

Я мог бывыполнить 2 запроса, сначала получить все media_id из таксономической таблицы, где title = "..." И playlist_id = "5", затем второй запрос выбрать все строки из media_table WHERE id IN (идентификаторы).

относится ли это кможет быть, какой-то запрос JOIN?

Я пробовал это, но я не получаю желаемых результатов:

$query = "SELECT * FROM {$media_table} 
        INNER JOIN {$taxonomy_table} 
        ON {$media_table}.id = {$taxonomy_table}.media_id 
        WHERE {$taxonomy_table}.type='tag' AND {$taxonomy_table}.title IN ($arg) AND {$taxonomy_table}.playlist_id=%d
        ORDER BY {$media_table}.order_id";

Кажется, что он смешивает все столбцы из обеих таблиц в результаты, но я толькохотите получить строки из media_table, которые имеют заголовок (и) из taxonomy_table.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

использовать объединение вместо объединения с вложенным / объединяющим запросом

    $query = "SELECT * FROM {$media_table} 
            INNER JOIN {$taxonomy_table} 
            ON {$media_table}.id = {$taxonomy_table}.media_id 
            WHERE {$taxonomy_table}.type='tag' AND {$taxonomy_table}.title IN ($arg) AND {$taxonomy_table}.playlist_id=%d
            ORDER BY {$media_table}.order_id 
union SELECT * FROM {$media_table}
WHERE media_id IN (
SELECT media_id FROM {$taxonomy_table} WHERE type='tag' AND title IN ($arg) AND playlist_id=%d
)
";
0 голосов
/ 23 сентября 2018

Кажется, что он смешивает все столбцы из обеих таблиц в результаты, но я хочу получить только строки из media_table, которые имеют заголовок (и) из taxonomy_table.

Причина в том, чтообъединение позволяет вам выбирать данные из обеих таблиц.Хитрость в этом случае состоит в том, чтобы заменить звездочку (*) на определенные столбцы или использовать префикс для звездочки.

примеры использования префикса:

$query = "SELECT {$media_table}.* FROM {$media_table} 
INNER JOIN {$taxonomy_table} 
ON {$media_table}.id = {$taxonomy_table}.media_id 
    `WHERE {$taxonomy_table}.type='tag' AND {$taxonomy_table}.title IN ($arg) AND` {$taxonomy_table}.playlist_id=%d
ORDER BY {$media_table}.order_id";

или

$query = "SELECT t1.* FROM {$media_table} t1
INNER JOIN {$taxonomy_table} t2
ON t1.id = t2.media_id 
WHERE t2.type='tag' AND t2.title IN ($arg) AND t2.playlist_id=%d
ORDER BY t1.order_id";

ОБНОВЛЕНИЕ: Вы подняли два «новых» вопроса в комментарии: из ваших сценариев использования я не вижу никакой причины использовать соединение здесь.

1: получить строки из media_table, которые имеют ВСЕ требуемые заголовки из таблицы таксономии

С моей точки зрения, не существует простого решения с использованием только SQL (кромеможет быть, действительно хакерские строковые операции в SQL).Самым простым решением может быть что-то вроде этого:

$countTitles = count(explode(",", $args))
$query = "SELECT media_id from {$media_table} WHERE $countTitles = (
SELECT count(media_id) from {$taxonomy_table} WHERE type='tag' AND title IN ($arg) AND playlist_id=%d
)"

2: получить строки из media_table, которые ЛЮБЫЕ требуемые заголовки из таблицы таксономии.

Это простов пункте.

$query = "SELECT * FROM {$media_table}
WHERE media_id IN (
SELECT media_id FROM {$taxonomy_table} WHERE type='tag' AND title IN ($arg) AND playlist_id=%d
)
";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...