-9

私のシステムでは、カテゴリとサブカテゴリに基づいてブランドを検索する必要があります。

銘柄表はこんな感じ

id brandname categoryid subcategoryid
1   xys       1,2,3      1,5,6       

検索すると、カテゴリを選択すると、カテゴリごとにすべてのサブカテゴリが表示されます。サブカテゴリを選択すると、そのカテゴリとサブカテゴリに基づいてすべてのブランドを表示する必要があります。同じブランドに複数のカテゴリとサブカテゴリがあるため、私のブランド テーブルは次のようになります。この問題を解決するのを手伝ってください

4

1 に答える 1

4

データベースの設計を考えると、次のように行うことができます。

SELECT * FROM mytable WHERE
    FIND_IN_SET('5', categoryid) > 0 AND FIND_IN_SET('3', subcategoryid) > 0;

これにより、カテゴリ 5 とサブカテゴリ 3 のすべてのアイテムが検索されます。

SELECT * FROM mytable WHERE
    FIND_IN_SET('5', categoryid) > 0 AND (
        FIND_IN_SET('3', subcategoryid) > 0
        OR
        FIND_IN_SET('9', subcategoryid) > 0
    );

上記は、カテゴリ 5、サブカテゴリ 3 および 9 のアイテムを検索します。もちろん、代わりに を使用して、両方のカテゴリにあるアイテムに制限することもできます。ANDOR

しかし、これはすべて不必要に高価です。次のように、ブランド名用のテーブルと、カテゴリとサブカテゴリ ID 用のテーブル、およびリンクを用意すると、より効果的です。

// This is an article. Many-to-one relation with brands.
CREATE TABLE articles
(
    id        integer primary key not null auto_increment,
    name      varchar(...),
    brand_id  integer,
    //, other data
);

CREATE TABLE brands
(
    id        integer primary key not null auto_increment,
    name      varchar(...)
    //, other data
);

// Categories. Many-to-Many relationship with articles.
CREATE TABLE categories
(
    id        integer primary key not null auto_increment,
    name      varchar(...)
    //, other data
);

// Subcategories. These are independent from categories, which
// may be right or wrong, depending. Being independent, we do not
// store here parent_category_id.
CREATE TABLE subcategories
(
    id        integer primary key not null auto_increment,
    name      varchar(...)
    //, other data
);

// Many to many relationship between articles and categories

CREATE TABLE mtm_article_in_category
(
    article_id  integer not null,
    category_id integer not null
);

CREATE TABLE mtm_article_in_subcategory
(
    article_id  integer not null,
    subcategory_id integer not null
);

// Add article 5 to categories 25, 37 and 119:
INSERT IGNORE INTO mtm_article_in_category VALUES ( 5, 25 ), ( 5, 37 ), ( 5, 119 );
// Remove article 18 from subcategory 92
DELETE FROM mtm_article_in_category WHERE article_id = 18 AND subcategory_id = 92;

このようにして、クエリをより高速に実行でき、「非常に多くの」カテゴリ (たとえば 50) を超えるカテゴリに記事を割り当てることができないなどの問題がなくなります。あるカテゴリーから別のカテゴリーに記事を移動したい場合の頭痛もありません。現在のデザインではほぼ不可能です。

このような私の検索では、最初にカテゴリを選択し、すべてのサブカテゴリがカテゴリに基づいています.次に、サブカテゴリを選択すると、そのカテゴリに基づいてすべてのブランドが表示され、サブカテゴリが表示されます.今、複数のカテゴリと複数のサブカテゴリで1つのブランド名を1回追加します.

「オーマイゴッド」と言わざるを得ません。「すべてのサブカテゴリを選択」できるようにするには/今/、これを変換する必要があります

 category    subcategory
 4,5         1,7,9,19
 5           7,9,11

5 1 5 7 5 9 5 19 5 7 5 9 5 11

次に を実行し、最後にに基づいDISTINCTてサブカテゴリを使用します。INNER JOINFIND_IN_SET

最初のステップ (CSV 行の「展開」) は、次のように実行できます: http://www.marcogoncalves.com/2011/03/mysql-split-column-string-into-rows/ ... そしてできる限りそれは些細なことです。

現在、PHP で分割を行っていると思います。

それをした後、INNER JOIN非常に高価です。

私たちは悪いお金を次々と投げています。現在のデータベース設計では、やりたいことを簡単に行うことができません。最も簡単な方法は次のとおりです。

// My search like this at first i chose category the all the subcategory
// come based on category.

$query = "SELECT subcategoryid FROM mytable WHERE FIND_IN_SET(:mycategory, categoryid) > 0;";
// and run the query.

$subcategories = array();
while($tuple = sql_fetch_tuple($exec))
{
    // Explode "1,2,3" into array {1, 2, 3}. Merge into subcategories removing
    // duplicates. Rinse. Repeat.
    $subcategories = array_unique(array_merge($subcategories, explode(',', $tuple['subcategoryid'])));
}
sql_free($exec);
// Now we have an array of subcategories.

// Then when i chose subcategory all the brand
// based on that category and subcategory come.

$subcat_query = array();
foreach($subcategories as $subcategory)
    $subcat_query[] = "FIND_IN_SET('$subcategory', subcategoryid)";
$subcat_query_sql = implode(' OR ', $subcat_query);

$query = "SELECT DISTINCT brand FROM mytable WHERE FIND_IN_SET(:cat, categoryid) AND ( $subcat_query_sql );";

// And here we get all brands. It is wise to save $subcat_query_sql in _SESSION.

// Next search will be:

// >Now i add one brand name
// > one time with multiple category and multiple subcategory.

// Note that you've subtly moved the target once more, now the 'category' has become "multiple".
$brands_arr[] = array();
foreach($brands as $brand)
    $brands_arr[] = "'" . sql_escape($brand) . "'";
$brands_sql = implode(',', $brands_arr);

// The cost of this $query is estimated as a significant percentage of U.S. gross internal product, so it ought to be cleared with the FED.

$query = "SELECT * FROM mytable WHERE brand IN ($brands_sql) AND FIND_IN_SET(:cat, categoryid) AND ( $subcat_query_sql );";

上記のクエリが何も返さない可能性もあります。サブカテゴリ 5 とカテゴリ 12 を検索したとします。リクエストにより、「すべてのサブカテゴリ」と「すべてのカテゴリ」を取得すると、ブランド 6 とサブカテゴリ 9 も返される場合があります。次に、これら 2 つの行が出てきます。

 Marlboro   5   12
 Lucky      6   9

ユーザーは「Marlboro 6 12」を選択します。彼は何も取得しません。そのクエリに一致する行はありません。

残念ながら、ユーザー インターフェイスとワークフロー/ユース ケースも検討する必要があります。

于 2012-08-30T11:44:00.317 に答える