我试图使用此查询从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 <> ''
)
)
答案 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
可以让您更好地了解如何使其更快地运行,哪些索引有用,等等。
答案 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
。但是,如果存在重复记录,则此嵌套方法可能具有更好的性能。