0

このクエリがあります

$query = "SELECT * FROM items WHERE itemStatus = '1' AND itemAdded > '$timestamp'";

このクエリが結果を返したら、結果をループします

結果の配列は、itemID、itemLocationID、categoryParentID、categoryID、itemName、itemDetails です。

ループ中に、同じクラス内で関数を呼び出して、他の 3 つのクエリを実行します。

$locationName = $this->getLocationByName($locationID);
$categoryParentName = $this->getCategoryByName($categoryParentID);
$categoryName = $this->getCategoryByName($categoryID);

関数 getLocationByName がこのクエリを実行します。

$q = mysql_query("SELECT * FROM locations WHERE locationID = '$locationID'");

これは、locationID、locationName、locationLink の配列を返します

関数 getCategoryByName がこのクエリを実行します。

$q = mysql_query("SELECT * FROM categories WHERE categoryID = '$categoryID'");

これは、categoryID、categoryName、categoryLink の配列を返します

誰かがこのクエリを最適化するのを手伝ってくれませんか。おそらくそれらに参加して、非常に多くのクエリを実行するのを節約してください。

前もって感謝します。

私は今このクエリを使用しています

$q = mysql_query("SELECT 
i.itemID, 
i.locationID,
i.categoryParentID,
i.categoryID, 
i.itemName,
i.itemDetails,
l.*,
c.*        

FROM items i 内部結合位置 l on i.locationID = l.locationID 内部結合カテゴリ c on i.categoryID = c.categoryID WHERE itemStatus = '1' AND itemAdded > '$timestamp'")or die(mysql_error());

結果は

Array

( [itemID] => 81300 [locationID] => 17 [categoryParentID] => 21 [categoryID] => 183 [itemName] => 何とか [itemDetails] => 何とか [locationName] => 予想通りの場所に見事に引き込まれます. [locationLink] => blah [categoryName] => すばらしい、期待どおりにカテゴリを取得します。[categoryLink] => blah )

[categoryName] => //these are missing for categoryParentID
[categoryLink] => //these are missing for categoryParentID
4

3 に答える 3

1

以下のクエリに似たものになると思います。$categoryParentNameをどこで使用しているのかわかりません。

クエリとデータの使用:

SELECT * FROM items WHERE itemStatus = '1' AND itemAdded > '$timestamp'
SELECT * FROM locations WHERE locationID = '$locationID'
SELECT * FROM categories WHERE categoryID = '$categoryID'

$locationName = $this->getLocationByName($locationID);
$categoryParentName = $this->getCategoryByName($categoryParentID);
$categoryName = $this->getCategoryByName($categoryID);

これで期待される結果セットが返されるかどうか教えてください。お役に立てれば

SELECT 
    it.itemID, it.itemLocationID, it.categoryParentID, it.categoryID, it.itemName, it.itemDetails,
    l.locationID, l.locationName, l.locationLink, 
    c.categoryID, c.categoryName, c.categoryLink
FROM items it 
LEFT JOIN locations l ON l.locationID = it.itemLocationID 
LEFT JOIN categories c ON c.categoryID = it.categoryID 
WHERE 
    it.itemStatus = '1' 
    AND it.itemAdded > '$timestamp'

categoryParentIDを使用してクエリを更新します-効率的だとは言いませんが、必要に応じてテストおよび最適化できます。

1つのオプションは、上記のクエリを更新することです(これが機能するかどうかはわかりません)。また、ORを使用した大規模な結果セットの場合、効率的ではありません。

LEFT JOIN categories c ON (c.categoryID = it.categoryID OR c.categoryID = it.categoryParentID)

私が見るもう1つのオプションは、2つの結果セットを取得することです(以下を参照)。1つはcategId = categIdの場合、もう1つはcategId = categParentIdの場合で、結果セットを1つの大きな結果セットに結合します。

SELECT 
    t.itemID, t.itemLocationID, t.categoryParentID, t.categoryID, t.itemName, t.itemDetails,
    l.locationID, l.locationName, l.locationLink, 
    t.categoryID, t.categoryName, t.categoryLink 
FROM 
(
SELECT 
    it.itemID, it.itemLocationID, it.categoryParentID, it.categoryID, it.itemName, it.itemDetails,
    c.categoryID, c.categoryName, c.categoryLink
FROM items it 
INNER JOIN categories c ON c.categoryID = it.categoryID 
WHERE 
    it.itemStatus = '1' 
    AND it.itemAdded > '$timestamp'

UNION -- [ALL]

SELECT 
    it.itemID, it.itemLocationID, it.categoryParentID, it.categoryID, it.itemName, it.itemDetails,
    c.categoryID, c.categoryName, c.categoryLink
FROM items it 
INNER JOIN categories c ON c.categoryID = it.categoryParentID 
WHERE 
    it.itemStatus = '1' AND 
    it.itemAdded > '$timestamp'
) AS t 
LEFT JOIN locations l ON l.locationID = t.itemLocationID 

他のアイデア(テストされておらず、idがintであると仮定)は、string/charとしてキャストする必要があります。このクエリを作成する方法はいくつかあります。構造テーブルとダミーデータを投稿すると、誰かがデモ/sqlfiddleを作成すると確信しています。

SELECT 
    it.itemID, it.itemLocationID, it.categoryParentID, it.categoryID, it.itemName, it.itemDetails,
    l.locationID, l.locationName, l.locationLink, 
    c.categoryID, c.categoryName, c.categoryLink
FROM items it 
LEFT JOIN locations l ON l.locationID = it.itemLocationID 
WHERE 
    it.itemStatus = '1' 
    AND it.itemAdded > '$timestamp' 
    AND c.category ID IN ( SELECT GROUP_CONCAT(categs) FROM (SELECT CONCAT(categoryID, ",", categoryParentID) AS categs FROM items ))
于 2013-02-19T16:06:33.690 に答える
1

私は * を選択ステートメントで使用しません 結合を含むクエリは次のようになります

SELECT 
    i.itemID, 
    i.itemLocationID,
    i.categoryParentID,
    i.categoryID, 
    i.itemName,
    i.itemDetails,
    l.*,
    c.*        
FROM 
    items i
    inner join locations l on i.itemLocationID = l.locationID
    inner join categories c on i.categoryID = c.categoryID
WHERE
    itemStatus = '1'
    AND itemAdded > '$timestamp'

お役に立てば幸いです。乾杯!

于 2013-02-19T16:08:40.170 に答える
0

明らかな何かが欠けていない限り、最初の開始として次のようなことをお勧めします。

select *
  from items i
  join locations l 
    on i.location_id=l.location_id
  join categories c
    on i.category_id=c.category_id
 where item_status='1'
   and itemAdded > '$timestamp'
于 2013-02-19T16:01:30.730 に答える