Mysql Sql-选择此选项可在存在特定数据时检索链接表中的数据

Mysql Sql-选择此选项可在存在特定数据时检索链接表中的数据,mysql,Mysql,我试图从主表、我的表单以及通过linktable链接的表中检索数据 这是我的三张桌子: my_form: # idmy_form, summary, description, station '1', 'OSR puncture', 'Puncture while driving to work', 'Thornbury' '2', 'Windscreen wiper broke', 'Wiper broke while going shopping', 'Bristol' '3', 'Out

我试图从主表、我的表单以及通过linktable链接的表中检索数据

这是我的三张桌子:

my_form:
# idmy_form, summary, description, station
'1', 'OSR puncture', 'Puncture while driving to work', 'Thornbury'
'2', 'Windscreen wiper broke', 'Wiper broke while going shopping', 'Bristol'
'3', 'Out of screenwash', 'Run out of screen wash en route to Cardiff', 'Cardiff'


form_action:
# idmy_form, action_id
'1', '201'
'1', '202'
'1', '203'
'2', '301'
'2', '302'
'3', '401'
'3', '402'
'3', '403'
'3', '404'
'3', '405'

actions:
# action_id, action_detail, action_required, action_date
'201', 'Fix', 'Open', '2013-01-01 00:00:00'
'202', 'Fix', 'Amend', '2013-01-04 00:00:00'
'203', 'Fix', 'Close', '2013-01-06 00:00:00'
'301', 'Fix', 'Open', '2013-03-01 00:00:00'
'302', 'Fix', 'Review', '2013-04-12 00:00:00'
'401', 'Fix', 'Open', '2013-09-04 00:00:00'
'402', 'Fix', 'Review', '2013-09-12 00:00:00'
'403', 'Fix', 'Close', '2013-09-17 00:00:00'
'404', 'Fix', 'Reopen', '2013-09-21 00:00:00'
'405', 'Fix', 'Close', '2013-09-23 00:00:00'
到目前为止,我拥有的sql是:

SELECT mf.idmy_form, mf.summary, mf.station, fa.action_id, act.action_required, act.action_date 
FROM CarAngel.my_form mf
INNER JOIN form_action fa ON mf.idmy_form = fa.idmy_form
LEFT OUTER JOIN actions act ON fa.action_id = act.action_id
WHERE act.action_required = 'Close';
这将输出以下内容,显然我的where子句限制了检索到的记录:

# idmy_form, summary, station, action_id, action_required, action_date
'1', 'OSR puncture', 'Thornbury', '203', 'Close', '2013-01-06 00:00:00'
'3', 'Out of screenwash', 'Cardiff', '403', 'Close', '2013-09-17 00:00:00'
我想我正在努力使用正确的联接类型,因为我希望返回主my_表单表中的每一行,并且仅当记录具有action.action_required='Close'时才包含一条匹配的操作记录

否则,我需要my_表单中的记录,但是对于my_表单记录,如果没有与action_required='Close'关联的action记录,则action数据只是作为null返回

**更新

我能让它自己工作的唯一方法是使用下面的sql。但是,在数据库视图中使用时,这不起作用

SELECT idmy_form, summary, station, 
    (SELECT actions.action_date FROM actions WHERE actions.action_required = 'Close'
        AND actions.action_id = 
        (SELECT form_action.action_id 
            FROM form_action WHERE form_action.idmy_form = my_form.idmy_form
            AND form_action.action_id = actions.action_id))
AS action_date
FROM my_form;
下面的jpw解决方案非常有效。所以问题回答了,谢谢

**一个进一步的查询是,如果数据集如上所述被修改为具有多个action记录,action_required='Close'与my_表单表中的一个标题记录相关,该怎么办。 这将提供以下返回的数据:

# idmy_form, summary, station, action_id, action_required, action_date
'1', 'OSR puncture', 'Thornbury', '203', 'Close', '2013-01-06 00:00:00'
'2', 'Windscreen wiper broke', 'Bristol', NULL, NULL, NULL
'3', 'Out of screenwash', 'Cardiff', '403', 'Close', '2013-09-17 00:00:00'
'3', 'Out of screenwash', 'Cardiff', '405', 'Close', '2013-09-23 00:00:00'

是否有一种方法可以仅通过“关闭”操作检索最新日期的操作记录。

如果您要查找的结果是:

idmy_form   summary             station     action_id   action_required action_date
1       OSR puncture            Thornbury   203         Close           2013-01-06 00:00:00.000
2       Windscreen wiper broke  Bristol     NULL        NULL            NULL
3       Out of screenwash       Cardiff     403         Close           2013-09-17 00:00:00.000
那么您需要的查询是:

SELECT 
    mf.idmy_form, 
    mf.summary, 
    mf.station, 
    a.action_id, 
    a.action_required, 
    a.action_date 
FROM my_form mf
LEFT JOIN (
    SELECT 
       act.action_id, 
       act.action_required, 
       act.action_date, 
       fa.idmy_form 
    FROM form_action fa
    JOIN actions act 
     ON fa.action_id = act.action_id 
     AND act.action_required = 'Close'
) a 
ON a.idmy_form = mf.idmy_form 

如果在左连接中添加where条件,则可以有效地消除空值并使其成为隐式内部连接,因此将筛选器添加到连接条件中。

感谢您的响应,这是有意义的。我已经更新了我的问题,因为我不需要返回所有记录。只是我问题底部更新的记录。任何进一步的想法都很好。如果我得到了解决方案,我将继续尝试不同的选项并进行更新。@NeilJohnson很抱歉,这花了一些时间,但我已经更改了我的答案,并认为它现在应该会给你想要的结果。非常感谢@jpw,这很好。我提出的另一个解决办法是修改到问题的末尾。虽然这在作为数据库视图输入时不起作用,但我在问题的底部还有一个问题。使用jpw的解决方案,它工作得很好,但我遇到了另一个场景。我试图找到一个解决方案,只检索头表记录的最新日期的操作记录。任何额外的想法都会很好。@NeilJohnson是的,这是可能的,但我认为你应该把它作为一个新问题发布,这样更多的人可以看到它,而不是在这里的评论中回答。