Mysql从一个表中获取基于另一个表的结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql从一个表中获取基于另一个表的结果相关的知识,希望对你有一定的参考价值。
我有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 =“...”AND playlist_id =“5”,然后第二个查询从media_table WHERE id IN(ids)中选择所有行。
这可能属于某种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
)
";
使用union而不是使用嵌套/连接查询进行连接
$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
)
";
以上是关于Mysql从一个表中获取基于另一个表的结果的主要内容,如果未能解决你的问题,请参考以下文章
将一个表的查询结果插入到另一个表中(oracle、mysql、sql 、GP)