2017-03-22 14 views
0

私は2つのテーブルがあります。MySQL - 列の値に基づくJOIN?

Table "categories" 

category | parents 
1   | 5,4,1 
2   | 3,2 

列両親はコンマで分割数のグループですので、IN(parents)

Table "categories_goods" 

item | category 
10 | 1 
12 | 2 

としてクエリで使用することができ、私は3番目のテーブルにデータをエクスポートします - すべてのカテゴリにすべての親が存在します。結果は:

Table "categories_goods_all" 

item | category 
10 | 5 
10 | 4 
10 | 1 
12 | 3 
12 | 2 

私はこれをPHPで解決しましたが、テーブルcategories_goodsに10000 * xの行がある場合は遅くなります。だから私は純粋なMySQLのソリューションを探しています。何か案は?

答えて

1

使用この

デモ: http://rextester.com/CAF76544

クエリ行にCSV分割するには、このanswer

select 
    g.item, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(c.parents, ',', numbers.n), ',', -1) category1 
from 
    (select 1 n union all 
    select 2 union all select 3 union all 
    select 4 union all select 5) numbers 
INNER JOIN categories c 
    on CHAR_LENGTH(c.parents) 
    -CHAR_LENGTH(REPLACE(c.parents, ',', ''))>=numbers.n-1 
    inner join categories_goods g 
    on c.category=g.category 
order by 
    c.category, n 

感謝。

説明:numberテーブルは、番号1 - 5を生成します。さらにparentに必要な場合は、ここに行を追加してください。その助けを借りて、csvを列に分けることができます。上記の回答URLを参照してください。

今、あなたはちょうどparent

+0

に対応itemをフェッチするためにcategories_goodsに参加行う必要があるが、これは素晴らしい仕事、ありがとう! :)任意の数の値を解析する方法はありますか?今では5で動作します。私は手動でselect 6 union allを追加できます...しかし、それは何とか無限にできますか? –

関連する問題