这个带有嵌套IN子句的查询出了什么问题?

时间:2016-05-01 21:57:14

标签: mysql sql database

我试图使用此查询从MySQL表中获取数据。但它需要永远运行。我认为查询本身和我使用的嵌套IN有些问题。有没有最佳方式来运行此查询?

SELECT * FROM xf_attachment_data WHERE data_id IN (
    SELECT data_id FROM xf_attachment WHERE content_id IN (
        SELECT field_value FROM xf_user_field_value WHERE field_id = 'medicalid' AND field_value <> ''
    )
)

3 个答案:

答案 0 :(得分:0)

尝试使用连接:

SELECT xad.* 
FROM xf_attachment_data AS xad
LEFT JOIN xf_attachment AS xa
  ON xad.data_id = xa.data_id
LEFT JOIN xf_user_field_value AS xufv
  ON xa.content_id = xufv.field_value -- from your original query
WHERE xufv.field_id = 'medicalid' 
  AND xufv.field_value <> ''

通过这种构造,优化可以做得更好,EXPLAIN可以让您更好地了解如何使其更快地运行,哪些索引有用,等等。

顺便说一句,你的内部查询中的列名看起来有点奇怪,你确定要将xf_attachment.content_id与xf_user_field_value.field_value进行比较吗?

答案 1 :(得分:0)

我真的不知道它是否最佳。但你可以试试这个:

Select * from xf_attachment_data AD,  xf_attachment A, xf_user_field_value FV where AD. Data_id = A.data_id and A.content_id = FV.field_value and field_id = 'medicalid' AND field_value <> '';

答案 2 :(得分:0)

首先,我建议使用EXISTS而不是in重写此内容,因为MySQL有时可以更好地使用EXISTS

SELECT ad.* 
ROM xf_attachment_data ad
WHERE EXISTS (SELECT 1
              FROM xf_attachment a
              WHERE a.data_id = ad.data_id AND
                    EXISTS (SELECT 1
                            FROM xf_user_field_value fv
                            WHERE fv.field_id = 'medicalid' AND
                                  a.content_id = fv.field_value
                           )
              );

然后,请确保您拥有正确的索引:xf_user_field_value(field_value, field_id)xf_attachment(data_id, content_id)

您可以考虑将其重写为join。但是,如果存在重复记录,则此嵌套方法可能具有更好的性能。