基本的に、属性テーブルと翻訳テーブルがあり、1 つの属性に対して複数の翻訳があります。
指定した言語に翻訳レコードがない場合でも、指定した言語の各属性の翻訳から ID と値を選択する必要があります。以下では、指定した言語に翻訳が存在しない属性が返されないため、結合テクニックが不足しているか、結合 (言語テーブルを含まない) がここでは機能していません。
select a.attribute, at.id, at.translation
from attribute a left join attributeTranslation at on a.id=at.attribute
where al.language=1;
このようにサブクエリを使用していますが、ここでの問題は、同じテーブルに同じパラメータで 2 つのサブクエリを作成することです (MySQL がそれらをグループ化しない限り、パフォーマンスが低下するように感じますが、多くの類似したサブクエリを実行することになるため、これは疑わしいです)。
select attribute,
(select id from attributeTranslation where attribute=a.id and language=1),
(select translation from attributeTranslation where attribute=a.id and language=1),
from attribute a;
1 つのクエリから ID と翻訳を取得できるようにしたいので、列を連結し、後で文字列から ID を取得します。これにより、少なくとも単一のサブクエリが作成されますが、それでも正しく見えません。
select attribute,
(select concat(id,';',title)
from offerAttribute_language
where offerAttribute=a.id and _language=1
)
from offerAttribute a
それで、質問の部分です。単一のサブクエリから複数の列を取得する方法はありますか、それとも 2 つのサブクエリを使用する必要がありますか (MySQL はそれらをグループ化するのに十分スマートですか?)、または結合するには次の方法を使用します。
[[attribute to language] to translation] (3 つのテーブルを結合すると、サブクエリよりもパフォーマンスが低下するようです)。
ベストアンサー1
はい、できます。必要なコツは、テーブル サーバーからテーブルを取得する方法が 2 つあるという概念です。1 つの方法は...
FROM TABLE A
もう一つの方法は
FROM (SELECT col as name1, col2 as name2 FROM ...) B
選択句とそれを囲む括弧に注目してくださいはテーブル、仮想テーブル。
したがって、2 番目のコード例を使用します (ここで取得しようとしている列を推測しています)。
SELECT a.attr, b.id, b.trans, b.lang
FROM attribute a
JOIN (
SELECT at.id AS id, at.translation AS trans, at.language AS lang, a.attribute
FROM attributeTranslation at
) b ON (a.id = b.attribute AND b.lang = 1)
実際のテーブルがattribute
この結合の最初のテーブルであり、私が呼び出したこの仮想テーブルb
が 2 番目のテーブルであることに注意してください。
このテクニックは、仮想テーブルが何らかの要約テーブルである場合に特に便利です。例:
SELECT a.attr, b.id, b.trans, b.lang, c.langcount
FROM attribute a
JOIN (
SELECT at.id AS id, at.translation AS trans, at.language AS lang, at.attribute
FROM attributeTranslation at
) b ON (a.id = b.attribute AND b.lang = 1)
JOIN (
SELECT count(*) AS langcount, at.attribute
FROM attributeTranslation at
GROUP BY at.attribute
) c ON (a.id = c.attribute)
どうなるかわかりますか? 2 つの列を含む仮想テーブルを生成しc
、それを他の 2 つの列と結合し、列の 1 つを句に使用しON
、もう 1 つを結果セットの列として返しました。