Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL-如何连接多个表_Php_Mysql_Sql - Fatal编程技术网

Php MySQL-如何连接多个表

Php MySQL-如何连接多个表,php,mysql,sql,Php,Mysql,Sql,我有一个MySQL数据库,有3个表:艺术家、流派和流派艺术家。我需要一个MySQL查询,它可以为我提供特定流派的所有艺术家。比如说摇滚乐。我没有加入MySQL表的经验,所以有人能帮我吗 我的表格行如下所示: 艺术家: artist_id (int, ai, pk) artist_name(varchar) artist_image(varchar) 类型: id, (int, ai, pk) name (varchar) parent_id (int) 流派艺术家: genre_artist

我有一个MySQL数据库,有3个表:艺术家、流派和流派艺术家。我需要一个MySQL查询,它可以为我提供特定流派的所有艺术家。比如说摇滚乐。我没有加入MySQL表的经验,所以有人能帮我吗

我的表格行如下所示:

艺术家:

artist_id (int, ai, pk)
artist_name(varchar)
artist_image(varchar)
类型:

id, (int, ai, pk)
name (varchar)
parent_id (int)
流派艺术家:

genre_artist_id (int, ai, pk)
genre_id (int)
artist_id (int)
有人能帮我吗


提前感谢…

假设您有$genreId中的rock id,您可以使用子查询

SELECT a.*
FROM
    `artists` a
    INNER JOIN `genre_artist` ga ON ga.artist_id = a.artist_id
    INNER JOIN `genre` g ON g.genre_id = ga.genre_id
WHERE
    g.name = 'Rock'
;
$genre_id = mysql_real_escape_string($genreId); // basic protection
$subquery = "SELECT artist_id FROM genre_artist WHERE genre_id = {$genre_id}";
$query = "SELECT * FROM artist WHERE artist_id IN ({$subquery})";
连接对于数据库来说可能非常重要。如果您没有添加正确的标识,并且表处于错误的模式,那么锁定表的时间可能会比需要的时间长,这会导致性能降低。
小提示:子查询的可能性较小,mysql的旧版本不支持它,不知道更新的版本

我在加入方面没有太多经验。。。您是否尝试过编写查询?看到你的尝试会很有帮助,因为你可能非常接近,你所需要的只是一个建议,让你得到正确的结果。请用您的任何尝试编辑您的问题。我反对您的投票,因为我无法想象这样做会比加入更好。坦白地说,这听起来像是一个非常糟糕的建议。这实际上相当不错,我会接受这个答案。。。但唯一的问题是,每个艺人的名字都会显示出来,就像他们有多少张专辑一样,例如,当一个艺人有5张专辑时,艺人的名字gts会显示5次。。。这怎么可能?我有一张专辑表,但显然它不包括在查询中…@SHT我写的查询只有在一个艺术家有许多流派艺术家条目时才会显示多行。我想既然你们有了这个表格,你们的艺术家和你们的流派之间就有一种多对多的关系。因此,一个艺术家可能有许多流派,一个流派可能与许多艺术家相关。如果是这样,您的设计允许此查询多次带来同一艺术家。如果这不是您的意图,那么您可能需要更改db设计。
SELECT artists.*
FROM artists join genre_artist on genre_artist.artist_id = artists.artist_id
             join genre        on genre.id = genre_artist.genre_id and genre.name = 'Rock';