Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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
mysql查询引用不同表中1列的2列_Mysql_Join - Fatal编程技术网

mysql查询引用不同表中1列的2列

mysql查询引用不同表中1列的2列,mysql,join,Mysql,Join,抱歉,若有人问我这个问题,但我无法将我找到的任何答案与我的情况联系起来 我已为此问题创建了临时表: describe temp; +-----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+-------+ | id

抱歉,若有人问我这个问题,但我无法将我找到的任何答案与我的情况联系起来

我已为此问题创建了临时表:

describe temp;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | int(11)      | NO   |     | 0       |       |
| artist    | varchar(255) | NO   |     | NULL    |       |
| title     | varchar(255) | NO   |     | NULL    |       |
| id_genre  | int(11)      | NO   |     | NULL    |       |
| id_genre2 | int(11)      | NO   |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
另一个相关表格是流派列表

我想创建一个查询,该查询将导致这两个查询的组合

select temp.title,genre.name
from temp
join genre on genre.id = temp.id_genre;

+------------------------+--------------+
| title                  | genre1       |
+------------------------+--------------+
| Tight Capris - 1958-B  | Rockabilly   |
| Endless Sleep - 1958-5 | MyFavourites |
| Daisy Mae - 1966       | Rockabilly   |
| Fire of love - 1966-58 | Rockabilly   |
| Stormy - 1963          | Pop          |
+------------------------+--------------+
5 rows in set (0.00 sec)

select temp.title,genre.name as genre2
from temp
join genre on genre.id = temp.id_genre2;

+------------------------+------------+
| title                  | genre2     |
+------------------------+------------+
| Tight Capris - 1958-B  | Rockabilly |
| Endless Sleep - 1958-5 | Rockabilly |
| Daisy Mae - 1966       | Rockabilly |
| Fire of love - 1966-58 | Rockabilly |
| Stormy - 1963          | Pop        |
+------------------------+------------+
5 rows in set (0.00 sec)
注意标题1中的类型差异:无休止的睡眠

我想创建一个如下所示的结果,只是将genre.id替换为genre的名称:

+------------------------+----------+-----------+
| title                  | id_genre | id_genre2 |
+------------------------+----------+-----------+
| Tight Capris - 1958-B  |      163 |       163 |
| Endless Sleep - 1958-5 |      161 |       163 |
| Daisy Mae - 1966       |      163 |       163 |
| Fire of love - 1966-58 |      163 |       163 |
| Stormy - 1963          |       99 |        99 |
+------------------------+----------+-----------+
5 rows in set (0.00 sec)

谢谢

您需要加入table
流派
两次,因为table
temp
上有两列依赖于它

SELECT  temp.title,
        a.name GenreA,
        b.Name GenreB
FROM    temp
        INNER JOIN genre a 
            ON a.id = temp.id_genre
        INNER JOIN genre b 
            ON b.id = temp.id_genre2
输出

╔════════════════════════╦══════════════╦════════════╗
║         TITLE          ║    GENREA    ║   GENREB   ║
╠════════════════════════╬══════════════╬════════════╣
║ Tight Capris - 1958-B  ║ Rockabilly   ║ Rockabilly ║
║ Endless Sleep - 1958-5 ║ MyFavourites ║ Rockabilly ║
║ Daisy Mae - 1966       ║ Rockabilly   ║ Rockabilly ║
║ Fire of love - 1966-58 ║ Rockabilly   ║ Rockabilly ║
║ Stormy - 1963          ║ Pop          ║ Pop        ║
╚════════════════════════╩══════════════╩════════════╝

这就是你需要的

SELECT
    title,
    genre1.name as genre1,
    genre2.name as genre2
FROM 
    temp
INNER JOIN genre as genre1
    ON genre1.id = id_genre
INNER JOIN genre as genre2
    ON genre2.id = id_genre2

我同意Stephan的观点,你需要加入两次类型表。 但使用左连接而不是内部连接可能是一个好主意:

SELECT  temp.title,
        a.name GenreA,
        b.Name GenreB
FROM    temp
        LEFT OUTER JOIN genre a 
            ON a.id = temp.id_genre
        LEFT OUTER JOIN genre b 
            ON b.id = temp.id_genre2
如果temp中的记录在某个id_流派列中为NULL,或者id与流派表中的某一行不匹配,这将有所帮助

增加:


关于“我如何用特定的流派进一步过滤它。例如,流派1=‘rockabilly’(不起作用)。”

同时,添加

HAVING genre1 = 'rockabilly'

谢谢它工作得很好。我想我有很多的学习要做,因为我不完全理解查询的语法。我如何用特定的类型进一步过滤它。例如,如果genre1='rockabilly'(这不起作用),您不应该使用
别名
,而应该使用原始列名,请参见此处,实际上
,因为
关键字是可选的。感谢大家的快速响应。还有,Stephan,我更熟悉你使用的语法,这有助于我更好地理解其他语法。我如何用特定的体裁进一步过滤这些语法。例如,genre1='rockabilly'(这不起作用)。Pete,我已经为您请求的过滤器添加了其他信息。如果我的回答有帮助,请投赞成票或接受。如果没有,请在下面评论,我将修改和改进我的答案。