2011-08-03 6 views
1

少し遅いですが、うまく動作するこのSQLを持っています。理想的には、where句に余分なサブクエリを入れたいと思っています。そして、country_iso = "uk"のようなものです。WHEREサブクエリを使用してSQLを改善する

SELECT c.content_name, c.content_telephone, c.content_address1 
    (SELECT w.weblink_url FROM weblinks w WHERE w.content_id = c.content_id ORDER BY w.weblink_ordering, w.weblink_id ASC LIMIT 1) 
    AS content_url,               
    (SELECT country_name FROM countries WHERE country_id = c.country_id LIMIT 1) 
    AS country_name,                              
    (SELECT country_iso FROM countries WHERE country_id = c.country_id LIMIT 1) 
    AS country_iso 
    FROM catcontents cc              
    LEFT JOIN content c ON c.content_id = cc.content_id               
    WHERE cc.category_id = 7 
    AND (SELECT country_iso FROM countries WHERE country_id = c.country_id LIMIT 1) = 'uk' 
ORDER BY cc.catcontent_ordering ASC, c.content_name ASC 
+0

質問は何ですか? – Yuck

+0

国のテーブルを3回クエリする必要がないため、クエリのパフォーマンスが向上するかどうかを尋ねています –

+0

彼はこの部分を変更したいと思っていません:AND(SELECT country_iso FROM countries WHERE country_id = c.country_id LIMIT 1)= 'uk'' –

答えて

1

この質問はあなたのニーズに合っていませんか? (基本的には、使用は代わりに、サブセレクトの、国を取得するために結合します。)

SELECT 
    c.content_name, 
    c.content_telephone, 
    c.content_address1, 

    countries.country_name, 
    countries.country_iso, 

    (
     SELECT w.weblink_url 
     FROM weblinks w 
     WHERE w.content_id = c.content_id 
     ORDER BY w.weblink_ordering, w.weblink_id ASC 
     LIMIT 1 
    ) content_url 

FROM catcontents cc 
LEFT JOIN content c ON c.content_id = cc.content_id 
JOIN countries ON countries.country_id = c.country_id 

WHERE cc.category_id = 7 
AND countries.country_iso = 'uk' 

ORDER BY cc.catcontent_ordering ASC, c.content_name ASC 
+1

+1 country_iso = 'uk'のレコードが複数ある場合、データを潜在的な問題として指摘する必要があることを知らない場合は、問題を解決しますサブクエリ内の 'limit 1'と' = 'uk''の制限は実際には – Seph

+0

になります。私はちょうど列とテーブルの名前に基づいて仮定しました。しかし、誰もが知っているように、誰もがすべてのお尻を作ると仮定する: –

0
SELECT c.content_name, 
     c.content_telephone, 
     c.content_address1, 
     w.weblink_url content_url, 
     country_name, 
     country_iso 
FROM catcontents cc              
LEFT JOIN content c ON c.content_id = cc.content_id 
LEFT JOIN weblink_url w ON w.content_id = c.content_id 
JOIN countries ON country_id = c.country_id 
        AND country_iso = 'uk'          
WHERE cc.category_id = 7 
関連する問題