我一直依赖于CREATE VIEW和别名来创建SQL查询,并且我相信它可能是一种更有效的方法。有人可以提供任何一般建议吗?这是我最新的憎恶:
SELECT associations2.object_id, associations2.term_id, associations2.cat_ID, associations2.term_taxonomy_id
FROM (SELECT objects_tags.object_id, objects_tags.term_id, wp_cb_tags2cats.cat_ID, categories.term_taxonomy_id
FROM (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id, wp_term_taxonomy.term_taxonomy_id
FROM wp_term_relationships
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
ORDER BY object_id ASC, term_id ASC)
AS objects_tags
LEFT JOIN wp_cb_tags2cats ON objects_tags.term_id = wp_cb_tags2cats.tag_ID
LEFT JOIN (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id as cat_ID, wp_term_taxonomy.term_taxonomy_id
FROM wp_term_relationships
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
WHERE wp_term_taxonomy.taxonomy = 'category'
GROUP BY object_id, cat_ID, term_taxonomy_id
ORDER BY object_id, cat_ID, term_taxonomy_id)
AS categories on wp_cb_tags2cats.cat_ID = categories.term_id
WHERE objects_tags.term_id = wp_cb_tags2cats.tag_ID
GROUP BY object_id, term_id, cat_ID, term_taxonomy_id
ORDER BY object_id ASC, term_id ASC, cat_ID ASC)
AS associations2
LEFT JOIN categories ON associations2.object_id = categories.object_id
WHERE associations2.cat_ID <> categories.cat_ID
GROUP BY object_id, term_id, cat_ID, term_taxonomy_id
ORDER BY object_id, term_id, cat_ID, term_taxonomy_id
答案 0 :(得分:2)
在对不同类型的连接进行一些研究以及使用别名的更好方法之后,我的SQL代码更加精简和高效(运行时间不长)。答案是双重的:使用正确的JOIN方法来减少返回的行数 - 在大多数情况下INNER JOIN特别有用(参见http://www.w3schools.com/sql/sql_join_inner.asp) - 并使用别名在多个列上连接同一个表。 / p>
后一种解决方案特别有用,因为我之前所做的主要是创建四个或五个视图(使用CREATE VIEW)以返回数据,然后根据其他条件过滤该数据。例如,我使用“CREATE VIEW view1 AS SELECT”语句返回行a,b,c和d,然后使用“SELECT a FROM view1 WHERE criteria”语句来过滤数据。有时这会重复多次。
完成相同任务的更有效方法是使用别名在同一个表上使用多个JOIN。结合大多数查询的INNER JOIN,它大大缩短了查询时间,并返回与更复杂的语句相同的行。
示例:
SELECT *
FROM table1
INNER JOIN table2 AS alias1
ON table1.col1 = alias1.col1
INNER JOIN table2 AS alias2
ON table1.col2 = alias2.col2
WHERE col2 = 'some_condition'
这种方法可以节省生命。