繁体   English   中英

MySQL从具有联接的另一个表中获取结果

[英]Mysql get results from one table based on another with join

我有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的所有行,并从taxonomy_table =“ sport,football”中选择标题。

我可以运行2个查询,首先从taxonomy_table中获取所有media_id,其中title =“ ...”和playlist_id =“ 5”,然后第二次查询从media_table中选择ID为ID(ID)的所有行。

这是否属于某种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的标题的行。

似乎将两个表中的所有列混合到结果中,但是我只想从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中检索具有来自taxonomy_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检索行中的任何必需标题来自taxonomy_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
)
";

使用联合而不是使用嵌套/联接查询联接

    $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
)
";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM