MySQLサブクエリで複数の列/フィールドを選択する 質問する

MySQLサブクエリで複数の列/フィールドを選択する 質問する

基本的に、属性テーブルと翻訳テーブルがあり、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 つを結果セットの列として返しました。

おすすめ記事