Mysql 为什么是SQL错误;“未知列”;在联接查询中?

Mysql 为什么是SQL错误;“未知列”;在联接查询中?,mysql,sql,join,Mysql,Sql,Join,我正在使用JOIN查询3个表,我需要对同一个表使用它两次。我收到一条“未知列”错误消息。我尝试过使用别名的各种方法,但我就是解决不了这个问题。有什么想法吗 SELECT DISTINCT jos_easypaypalbuttons_ipn.atendente , jos_easypaypalbuttons_ipn.btn_name , pagseguro.atendente , pagseguro.produto FROM jos_easypaypalbutt

我正在使用
JOIN
查询3个表,我需要对同一个表使用它两次。我收到一条“未知列”错误消息。我尝试过使用别名的各种方法,但我就是解决不了这个问题。有什么想法吗

SELECT DISTINCT jos_easypaypalbuttons_ipn.atendente
     , jos_easypaypalbuttons_ipn.btn_name
     , pagseguro.atendente
     , pagseguro.produto 
  FROM jos_easypaypalbuttons_ipn, pagseguro
 INNER JOIN produtos pp ON jos_easypaypalbuttons_ipn.btn_name = pp.cod_produto
 INNER JOIN produtos ps ON pagseguro.produto = ps.cod_produto
 WHERE jos_easypaypalbuttons_ipn.payer_email = '$email' 
    OR pagseguro.email = '$email' 
   AND pp.modo_consulta = 'imediata' 
    OR ps.modo_consulta = 'imediata'
消息:

“on子句”中的未知列“jos_easypaypalbuttons_ipn.btn_name”

表格结构:

CREATE TABLE produtos 
(
    id int auto_increment primary key, 
    produto varchar(20), 
    modo_consulta varchar(30)
    );

CREATE TABLE jos_easypaypalbuttons_ipn 
(
    id int auto_increment primary key, 
    btn_name varchar(20), 
    atendente varchar(30),
    payer_email varchar(50)
    );

CREATE TABLE pagseguro 
(
    id int auto_increment primary key, 
    produto varchar(20), 
    atendente varchar(30),
    email varchar(50)
    );
    INSERT INTO produtos
    (modo_consulta, produto)
    VALUES
    ('imediata', 'BR0120'),
    ('imediata', 'BR0130');

    INSERT INTO jos_easypaypalbuttons_ipn
    (atendente, btn_name, payer_email)
    VALUES
    ('sibila', 'BR0120', 'me@lettura.com'),
    ('lua', 'BR0130', 'me@lettura.com');

    INSERT INTO pagseguro
    (atendente, produto, email)
    VALUES
    ('patricia', 'BR0120', 'me@lettura.com'),
    ('lua', 'BR0130', 'me@lettura.com');
样本数据:

CREATE TABLE produtos 
(
    id int auto_increment primary key, 
    produto varchar(20), 
    modo_consulta varchar(30)
    );

CREATE TABLE jos_easypaypalbuttons_ipn 
(
    id int auto_increment primary key, 
    btn_name varchar(20), 
    atendente varchar(30),
    payer_email varchar(50)
    );

CREATE TABLE pagseguro 
(
    id int auto_increment primary key, 
    produto varchar(20), 
    atendente varchar(30),
    email varchar(50)
    );
    INSERT INTO produtos
    (modo_consulta, produto)
    VALUES
    ('imediata', 'BR0120'),
    ('imediata', 'BR0130');

    INSERT INTO jos_easypaypalbuttons_ipn
    (atendente, btn_name, payer_email)
    VALUES
    ('sibila', 'BR0120', 'me@lettura.com'),
    ('lua', 'BR0130', 'me@lettura.com');

    INSERT INTO pagseguro
    (atendente, produto, email)
    VALUES
    ('patricia', 'BR0120', 'me@lettura.com'),
    ('lua', 'BR0130', 'me@lettura.com');

更新。当匹配表
produtos时,所需的输出是来自两个表
pagseguro
jos\u easypaypaypalbuttons
的唯一行
atendente
。mod\u consulta
'imediata'

ATENDENTE   BTN_NAME PRODUTO  MOD_CONSULTA
-----------------------------------------
sibila      BR0120            imediata   
lua         BR0130            imediata
patricia             BR0120   imediata

根据您的预期输出,我得出结论,您希望两个表{jos_easypaypaypalbuttons_ipn,pagseguro}的
完全联接
(和/或
联合
)。(并添加一些来自produtos的装饰)

通过将
完全联接
子查询放入CTE中也可以实现这一点:

WITH two AS (
        SELECT  COALESCE(ipb.atendente, pgs.atendente) AS atendente
        , COALESCE(ipb.btn_name,pgs.produto) AS zzz
        , COALESCE(ipb.payer_email,pgs.email) AS payer_email
        , ipb.btn_name AS btn_name
        , pgs.produto AS produto
        FROM jos_easypaypalbuttons_ipn ipb
        FULL JOIN pagseguro pgs ON pgs.atendente = ipb.atendente
                        AND pgs.produto = ipb.btn_name
        )
SELECT DISTINCT two.atendente
     , two.btn_name
     , two.produto
        , pp.modo_consulta
 FROM two
 JOIN produtos pp ON pp.produto = two.zzz
 WHERE two.payer_email = 'me@lettura.com'
   AND pp.modo_consulta = 'imediata'
        ;
结果是:

 atendente | btn_name | produto | modo_consulta 
-----------+----------+---------+---------------
 lua       | BR0130   | BR0130  | imediata
 sibila    | BR0120   |         | imediata
 patricia  |          | BR0120  | imediata
(3 rows)
更新XXX:通过使用并集避免完全联接。(YMMV.叹气)


后果:请注意,
{jos_easypaypalbuttons_ipn,pagseguro}
基本上是同构的。通过组合这两个表,可能添加一个指示符/类型标签字段,可以避免很多复杂性。Adagium:
对联合的需要(通常)表明数据建模问题

从您的预期输出中,我得出结论,您希望两个表{jos_easypaypalbuttons\u ipn,pagseguro}的
完全连接
(和/或
联合
)。(并添加一些来自produtos的装饰)

通过将
完全联接
子查询放入CTE中也可以实现这一点:

WITH two AS (
        SELECT  COALESCE(ipb.atendente, pgs.atendente) AS atendente
        , COALESCE(ipb.btn_name,pgs.produto) AS zzz
        , COALESCE(ipb.payer_email,pgs.email) AS payer_email
        , ipb.btn_name AS btn_name
        , pgs.produto AS produto
        FROM jos_easypaypalbuttons_ipn ipb
        FULL JOIN pagseguro pgs ON pgs.atendente = ipb.atendente
                        AND pgs.produto = ipb.btn_name
        )
SELECT DISTINCT two.atendente
     , two.btn_name
     , two.produto
        , pp.modo_consulta
 FROM two
 JOIN produtos pp ON pp.produto = two.zzz
 WHERE two.payer_email = 'me@lettura.com'
   AND pp.modo_consulta = 'imediata'
        ;
结果是:

 atendente | btn_name | produto | modo_consulta 
-----------+----------+---------+---------------
 lua       | BR0130   | BR0130  | imediata
 sibila    | BR0120   |         | imediata
 patricia  |          | BR0120  | imediata
(3 rows)
更新XXX:通过使用并集避免完全联接。(YMMV.叹气)


后果:请注意,
{jos_easypaypalbuttons_ipn,pagseguro}
基本上是同构的。通过组合这两个表,可能添加一个指示符/类型标签字段,可以避免很多复杂性。Adagium:
对联合的需求(通常)表明存在数据建模问题

您是否打算在pagseguro上进行交叉连接?列
btn\u name
是否存在于
jos\u easypaypalbuttons\u ipn
表中?如果不对表运行查询,则无法确定,但是你真的想删除这行中的逗号:
来自jos_easypaypalbuttons_ipn,pagseguro
请看(很抱歉,这不是重复的错误标记。但是你会发现非常有用的信息来改进你的查询)@Adry请看这个——我想你想使用这个。问题是您混合了连接语法。您是否打算在pagseguro上进行交叉连接?列
btn\u name
是否存在于
jos\u easypaypalbuttons\u ipn
表中?如果不对表运行查询,则无法确定,但确实要从此行删除逗号:
来自jos\u easypaypalbuttons\u ipn,pagseguro
请参见(很抱歉,这里没有重复的错误标记。不过,您会发现非常有用的信息来改进您的查询)@Adry请参见此--我认为您希望使用此标记。问题是您混合了连接语法。不幸的是,MySQL没有
完全连接
,它也没有
WITH
子句。在这种情况下,您需要临时修改,可能需要使用左连接+右连接和/或联合。@wildplasser非常有用!这超出了我的知识范围,我现在将花时间研究它。不幸的是,MySQL没有
完全连接
,它也没有
WITH
子句。在这种情况下,你需要即兴创作,可能需要使用左连接+右连接和/或联合。@wildplasser非常感谢!这超出了我的知识范围,我现在将花时间研究它。