2

我有一个艺术家表和一个艺术家别名表。Artist_alias 包含所有可能的艺术家名称。

我的查询,以获取多个艺术家的艺术家数据,如下所示:

$sql = "SELECT artist.artist_id, artist.artist_name
        FROM artists artist
        WHERE artist.artist_id IN (3,9,500);";

现在,我还想包括任何已知的别名,可以是 1 或 X。我可以在上面的查询中获取这些信息吗?或者这是一个单独的查询?

我正在考虑做类似的事情:

$sql = "SELECT artist.artist_id, artist.artist_name, 
       (SELECT * FROM artists_alias WHERE [???])....";

但是我收到错误消息“子查询返回超过 1 行”——我是否让这比现在更复杂?这可以是一个查询吗?

我很乐意用逗号分隔别名,例如返回行可能如下所示:3,“ben folds 5”,“ben folds 5,benfolds,ben folds 5, folds 5”

4

3 回答 3

5

您将需要一个LEFT JOIN反对artist_alias来检索这些。如果您希望它们以逗号分隔,请使用聚合GROUP_CONCAT()

使用LEFT JOIN以便即使艺术家没有关联的别名也会返回一行。

每个别名一行(每行复制艺术家信息):

SELECT
  artist.artist_id, 
  artist.artist_name,
  /* Retrieves all cols from artists_alias. SELECT only what you need... */
  artists_alias.*
FROM
  artist
  /* Assuming there's an artists_alias.artist_id. Substitute the correct column name */
  LEFT JOIN artists_alias ON artist.artist_id = artists_alias.artist_id
WHERE artist.artist_id IN (3, 9, 500)

或者通过逗号分隔的别名列表GROUP_CONCAT()

SELECT
  artist.artist_id, 
  artist.artist_name,
  /* Substitute the correct column name for the actual alias */
  GROUP_CONCAT(artists_alias.alias) AS all_aliases
FROM
  artist
  LEFT JOIN artists_alias ON artist.artist_id = artists_alias.artist_id
WHERE artist.artist_id IN (3, 9, 500)
GROUP BY 
  artist.artist_id,
  artist.artist_name
于 2013-03-06T03:37:17.763 回答
2

如果要在一行中返回所有别名,请使用group_concat()

SELECT a.artist_id, a.artist_name,
       group_concat(aa.alias) as aliases
FROM artists artist left outer join
     artists_alias aa
     on a.artist_id = aa.artist_id
WHERE at.artist_id IN (3,9,500)
group by a.artist_id, a.artist_name
于 2013-03-06T03:43:52.407 回答
-1

把限制1放在最后。

select * from tble where a=1 limit 1;

于 2013-03-06T03:38:12.770 回答