2013-11-01 73 views
1

回到我的MySQL数据库,有两个表,一个有两个键值,而第二个从两个表中选择并始终从一个

第一表总是有数据与之相关的1到N,但与之相关的第二张表可能没有。 我需要总是返回第一个数据,独立如果第二个表中没有。

继承人我查询:

select a.*, b.* FROM disp_ofer a, ofer_detl b 
WHERE 
a.esta_cod = 'Lelis' 
AND 
a.disp_ofer_data = '2013-10-30 16:07:20' 
AND 
b.disp_ofer_data = a.disp_ofer_data 
AND 
b.esta_cod = a.esta_cod 
+2

使用'留下join'。另外,我假设用_“有两个关键值”_你真的意味着_一个复合主键_对吗? – geomagas

+0

@darkman您不应该根据声望或投票选择答案。我的答案格式更好,内容更多。我可以问你为什么选择另一个吗? – plalx

回答

2

使用join语法...联接表。

在你的情况下,一个左加入。

select a.*, b.* FROM disp_ofer a 
Left join ofer_detl b 
    on b.disp_ofer_data = a.disp_ofer_data and b.esta_cod = a.esta_cod 
WHERE 
a.esta_cod = 'Lelis' 
AND 
a.disp_ofer_data = '2013-10-30 16:07:20' 
0
select a.*, b.* 
FROM disp_ofer a 
LEFT OUTER JOIN ofer_detl b ON (b.esta_cod = a.esta_cod AND b.disp_ofer_data = a.disp_ofer_data) 
WHERE 
a.esta_cod = 'Lelis' 
AND 
a.disp_ofer_data = '2013-10-30 16:07:20' 
+0

'OUTER'关键字不是必需的。 – plalx

+0

是的,但给理解 – LINQ2Vodka

1

始终使用JOIN语法,而不是在FROM声明列出多个表。这被认为是一种更好的做法。

A LEFT JOIN可以让你实现这个目标。 NATURAL关键字将执行,然后自动连接两个表中存在的所有列。

SELECT a.*, b.* 
FROM disp_ofer a 
NATURAL LEFT JOIN ofer_detl 
WHERE a.esta_cod = 'Lelis' AND a.disp_ofer_data = '2013-10-30 16:07:20' 
0

我建议你不要只是从你的代码的任何答案中提出一个查询,并忘记这个问题,但要阅读和理解它。连接非常容易理解,它们是每个Web开发人员都应该知道的基础知识的一部分。 This article会帮助你,我希望。

下面进入我的版本的查询:

SELECT do.*, od.* 
FROM disp_ofer do 
LEFT JOIN ofer_detl od USING(ofer_data, esta_cod) 
WHERE 
    do.esta_cod = 'Lelis' 
    AND do.disp_ofer_data = '2013-10-30 16:07:20'