1

私は3つのテーブルを持っています。1 番目: "属性" 2 番目: "属性値" 3 番目: "製品"

最初にこのクエリがあります:

SELECT a.*, p.ATTRIBUTE_CODE, p.ATTRIBUTE_VALUE, p.KATEGORIA  
FROM atributy a JOIN produkty p ON p.ATTRIBUTE_CODE
LIKE CONCAT('%', a.code, '%')
AND
KATEGORIA IN ('$kategoria_sql') 
GROUP BY a.value

そして、私の2番目のクエリはこれです:

SELECT * FROM atributy_value
INNER JOIN produkty 
ON produkty.ATTRIBUTE_VALUE LIKE CONCAT('%', atributy_value.ValueCode, '%')
AND AttributeCode = '$atribut_kod' 
AND KATEGORIA IN ('$kategoria_sql')
GROUP BY atributy_value.Value

この2つのクエリの1つをより良くしてください。理由: Web e-shop の読み込みに時間がかかりすぎています。

編集:

$query = mysql_query("
SELECT a.*, p.ATTRIBUTE_CODE, p.ATTRIBUTE_VALUE, p.KATEGORIA  
FROM atributy a JOIN produkty p ON p.ATTRIBUTE_CODE LIKE CONCAT('%', a.code, '%') 
AND KATEGORIA IN ('$kategoria_sql') 
GROUP BY a.value ");

while($result = mysql_fetch_object($query)){

$atribut_kod = $result->code;
$atribut_value = $result->value;
$nazov_produktu = $result->NAZOV;
$value1 = $result->ATTRIBUTE_VALUE;
$value1 = explode(" ", $value1);

$value1_count = count($value1);

echo "<div class=\"parametre_panel\">
<h3>".$atribut_value."</h3>
";

$url_kody .= "$atribut_kod,";

$hodnoty_qry = mysql_query("
SELECT * FROM atributy_value
INNER JOIN produkty ON produkty.ATTRIBUTE_VALUE LIKE CONCAT('%', atributy_value.ValueCode, '%')
AND AttributeCode = '$atribut_kod' 
AND KATEGORIA IN ('$kategoria_sql')  
GROUP BY atributy_value.Value ");

 while($hodnoty_res = mysql_fetch_object($hodnoty_qry)){
 $cislo_hodnoty = $hodnoty_res->ValueCode;
 echo "<input type=\"checkbox\" class=\"ZobrazParametrickeVyhladavanie\"   name=\"value[]\" id=\"$cislo_hodnoty\" value=\"".$atribut_kod."-".$cislo_hodnoty."\"><label for=\"$cislo_hodnoty\">".$hodnoty_res->Value."</label>
 ";

 $url_hodnoty .= "$cislo_hodnoty,";
} //second query while()
echo "</div>";
} //first query while()

編集2:

私のテーブル構造

produkty:       http://i.imgur.com/J4Kz2CE.png 
atributy_value: http://i.imgur.com/nX1uRph.png 
atributy:       http://i.imgur.com/mlCa3It.png

インデックス:

atributy:         http://i.imgur.com/ppMEEOe.png
atributy_value:   http://i.imgur.com/RHAeSiu.png
produkty:         http://i.imgur.com/IUrgy9l.png
4

3 に答える 3

0

以下のクエリを試すことができます:

SELECT a.*, 
       p.ATTRIBUTE_CODE, 
       p.ATTRIBUTE_VALUE, 
       p.KATEGORIA  
  FROM atributy a 
  JOIN (SELECT * 
          FROM atributy_value
         INNER JOIN produkty 
            ON produkty.ATTRIBUTE_VALUE LIKE CONCAT('%', atributy_value.ValueCode, '%')
           AND AttributeCode = '$atribut_kod' 
           AND KATEGORIA IN ('$kategoria_sql')
         GROUP BY atributy_value.Value) p 
    ON p.ATTRIBUTE_CODE LIKE CONCAT('%', a.code, '%')
   AND KATEGORIA IN ('$kategoria_sql') 
 GROUP BY a.value

内部クエリでは、必要な列のみを選択します

これがうまくいくことを願っています。

于 2013-07-29T08:45:42.187 に答える
0

ここでは 2 つのことが遅いです。

最初 - 不要な外側/内側ループ。単一の SQL クエリでこれを実行できるはずです。これにより、時間を大幅に節約できます。あなたのテーブルの定義を見ずに、これは私が提案できる最高のものです:

 SELECT a.*, p.*, av.*
 FROM produkty p 
 JOIN atributy a ON p.ATTRIBUTE_CODE LIKE CONCAT('%', a.code, '%') 
 JOIN atributy_value av ON p.ATTRIBUTE_VALUE LIKE CONCAT('%', av.ValueCode, '%') 
 WHERE 
 KATEGORIA IN ('$kategoria_sql') 

少なくとも、それはテストの出発点です。

2 番目 - LIKE '%value%' を使用して 2 つのテーブルを結合します。これら 2 つのテーブルをリンクする整数 ID はありませんか? または、少なくとも、テキストは完全に一致する必要があり、「%」を削除できますか?

EDIT(テーブル構造を追加した後):

2 つの結合があります。1 つ目は、nice インデックス付き整数 atributy_value.ValueCode からインデックスなしテキスト フィールド produkty.ATTRIBUTE_CODE への結合、2 つ目は、インデックスなしテキスト フィールド atributy.code から別のインデックスなしテキスト フィールド produkty.ATTRIBUTE_CODE への結合です。

これは適切なテーブル構造ではありません。すべてのテーブルに結合する一意の整数 ID があれば、より簡単で高速になります。しかし、これを変更する時間はないかもしれません。

元のクエリの % を削除して、列が完全に一致することを主張できますか? シンプルにするために、次のように置き換えることができます。

LIKE CONCAT('%', a.code, '%')

と置換する

= a.code

LIKE CONCAT('%', atributy_value.ValueCode, '%') 

と置換する

= CONVERT( varchar(500), atributy_value.ValueCode)

これにより、より高速になります。それでも不十分な場合は、Produkty.ATTRIBUTE_CODE、Produkty.ATTRIBUTE_VALUE、および attributy.code にインデックスを追加できます。

于 2013-07-29T12:54:42.377 に答える