我有三个简单的表,如下所示:
+----+-------------+ +----+-----------+ +----+---------------+
| artists | | albums | | songs |
+----+-------------+ +----+-----------+ +----+---------------+
| id | name | | id | name | | id | name |
+----+-------------+ +----+-----------+ +----+---------------+
| 0 | The Beatles | | 0 | Help! | | 0 | Help! |
| 1 | Metallica | | 1 | Metallica | | 1 | Enter Sandman |
+----+-------------+ +----+-----------+ +----+---------------+
我想查询导致以下结果:
+--------+---------------+
| type | name |
+--------+---------------+
| artist | The Beatles |
| artist | Metallica |
| album | Help! |
| album | Metallica |
| song | Help! |
| song | Enter Sandman |
+--------+---------------+
我正在尝试使用
LIKE
查询来搜索艺术家,专辑和歌曲。现在,我使用下面的SQL从三列中获取结果,然后使用Ruby将它们组合到一个对象中。我认为使用纯SQL而不是使用解释语言返回结果会更加有效。
SELECT name FROM artists WHERE name LIKE 'something%'
SELECT name FROM albums WHERE name LIKE 'something%'
SELECT name FROM songs WHERE name LIKE 'something%'
我对SQL不太了解,并且已经为此苦苦挣扎了几天,并且想知道这里是否有人可以为我指明正确的方向。
最佳答案
正如其他人建议的那样,您可以使用UNION。但是,UNION的语义迫使数据库消除通常需要排序操作的重复行。由于您知道每个查询都必须返回非重复的行,因此使用UNION ALL会更有效。就像是
SELECT *
FROM (SELECT 'artists' as type, name
FROM artists
UNION ALL
SELECT 'albums' as type, name
FROM albums
UNION ALL
SELECT 'songs' as type, name
FROM songs)
WHERE name LIKE 'something%'
无论使用哪种数据库引擎,都应该能够将
NAME
上的谓词推入被UNION ALL连接在一起的三个分支中的每个分支。但是值得在查询计划中进行确认。