0

IF ステートメントに基づいて文字列を取り戻そうとしていますが、非常に遅いです。

最初のサブクエリと関係がありますが、同じ結果をより速く戻すためにこれを再配置する方法がわかりません。

ここに私のSQLがあります:

SELECT IF
(
    (
        SELECT COUNT(*)
        FROM 
            (
                SELECT DISTINCT enquiryId, type 
                FROM parts_enquiries, parts_service_types AS pst 
                WHERE parts_enquiries.serviceTypeId = pst.id
            ) AS parts
        WHERE parts.enquiryId = enquiries.id
    ) > 1, 'Mixed',
    (
        SELECT DISTINCT type 
        FROM parts_enquiries, parts_service_types AS pst 
        WHERE parts_enquiries.serviceTypeId = pst.id AND enquiryId = enquiries.id
    )
) AS partTypes
FROM  enquiries,
entities
WHERE enquiries.entityId = entities.id

どうすれば速くなりますか?


以下の元のクエリを変更しましたが、サブクエリが複数の行を返すというエラーが発生しています。

SELECT
(SELECT
   CASE WHEN COUNT(DISTINCT type) > 1 THEN 'Mixed' ELSE `type` END AS type
FROM parts_enquiries 
INNER JOIN parts_service_types AS pst ON parts_enquiries.serviceTypeId = pst.id
INNER JOIN enquiries ON parts_enquiries.enquiryId = enquiries.id
INNER JOIN entities ON enquiries.entityId = entities.id
GROUP BY enquiryId) AS partTypes
FROM  enquiries,
entities
WHERE enquiries.entityId = entities.id

EXPLAIN 結果

4

2 に答える 2

1

このクエリで同じ結果が得られるかどうかを確認してください。

SELECT 
   enquiryId, 
   CASE WHEN COUNT(DISTINCT type) > 1 THEN 'Mixed' ELSE `type` END AS type
FROM parts_enquiries 
INNER JOIN parts_service_types AS pst ON parts_enquiries.serviceTypeId = pst.id
INNER JOIN enquiries ON parts_enquiries.enquiryId = enquiries.id
INNER JOIN entities ON enquiries.entityId = entities.id
GROUP BY enquiryId

しかし、NBのコメントはまだ有効です。および インデックスが使用されているかどうか、およびその他の情報を確認するには、EXPLAINおよび テーブルの定義を確認する必要があります。

于 2013-03-01T10:42:37.370 に答える
0

これにより、必要なものが得られるはずです。

まず、部品の問い合わせと部品のサービス タイプを事前に問い合わせて、問い合わせ ID でグループ化された部品「タイプ」の数と最小値の両方を探します。

次に、その結​​果に対して IF() を実行します。個別のカウントが > 0 の場合は、「混合」です。MIN() を実行したので、1 つだけの場合は、いずれにせよ、必要な 1 つの値の説明しかありません。

SELECT
      E.ID
      IF ( PreQuery.DistTypes > 1, 'Mixed', PreQuery.FirstType ) as PartType
   from 
      Enquiries E
         JOIN ( SELECT
                      PE.EnquiryID,
                      COUNT( DISTINCT PE.ServiceTypeID ) as DistTypes,
                      MIN( PST.Type ) as FirstType
                   from 
                      Parts_Enquiries PE
                         JOIN Parts_Service_Types PST
                            ON PE.ServiceTypeID = PST.ID
                   group by 
                      PE.EnquiryID ) as PreQuery
            ON E.ID = PreQuery.EnquiryID
于 2013-03-01T10:47:18.250 に答える