? asked in 電腦與網際網路程式設計 · 1 decade ago

SQL如何過濾重複資料

我的問題是這樣的,

產品A(下面有A1,A2,A3)

產品B(下面有B1,B2,B3)

我把產品和每一部份JOIN LEFT,

如此我點選產品A,會同時出現A1+A2+A3的內容(因為我讓參數為,產品=A,對A1,A2,A3而言,條件都符合)

現在我問題來了,如果我有A1,A2,A3,那麼我的產品A這個項目會連續出現三次,如果有A1,A2,A3......A5,那產品A這個項目會連續出現五次...,有違我想讓產品A,產品B當父層,A1,A2,A3,B1,B2,B3當子層的構想,我目前的做法是,多一個欄位做重複記號,當產品A已經有了A1(是否重複=0),我的A2,A3就讓(是否重複的欄位=1),但不太科學,我使用DISTINCT(vol_process.su_id),也是不行,因為我SELECT FROM的欄位跟DISTINCT的欄位不是同一個.....

請問有沒有好方法??

$SQL_content="SELECT product_name_en.*,product_content_en.*,item_name_en.item_name,item_name_en.tname_picpath ";

$SQL_content.="FROM product_name_en AS product_name_en LEFT JOIN product_content_en AS product_content_en ON product_name_en.p_id=product_content_en.p_id ";

$SQL_content.="LEFT JOIN item_name_en AS item_name_en ON product_content_en.t_id=item_name_en.t_id ";

$SQL_content.="WHERE product_content_en.p_id='$p_id' and product_content_en.duplicate='0'";

$res_content=mysql_query($SQL_content);

$row_content=mysql_fetch_array($res_content);

product_content_en就是我說的A1 A2 A3.....

item_name_en 就是我說的產品一 產品二....

問題有些複雜...,希望我能獲救~~~~

Update:

W.B.G :不是啦,我希望只出現產品A,然後點選後可以直接看到

A1 A2 A3同時出現(這個我已經測試成功),

可是不只會出現一次產品A,

因為產品A下面有A1 A2 A3,

所以會出現 產品A 產品A 產品A 連續出現三次.....

我希望只要出現一次產品A就好

4 Answers

Rating
  • 1 decade ago
    Favorite Answer

    這個很簡單的問題,需要搞成那麼複雜嗎?我直接使用單一table來表示,要全部資料或設定條件皆可,但唯一的前題是此一作法是oracle專用,其他是否可行則不得而知了。

    select case when rn = 1 then product_title else ' ' end product_title,product_detail from (select product_title,product_detail, row_number() over (partition by product_title order by product_detail asc) as rn from sample_table) [where product_title = :input_qualified];

    單一欄位亦可看需要拆成兩個,以oracle 而言使用like速度似乎較慢,因此,建議要使用時以使用substr方式取出欄位部份值比對較佳。除非是"%aaa%"此種狀況,就非得使用like不可了。

    2007-02-01 18:42:02 補充:

    忘了 order by 了。

    order by product_title asc,product_detail asc;

    Source(s): me
  • 1 decade ago

    基本上以關聯式資料庫的觀念看來~~我建議你在table a加個欄位是參考到table b的

    這樣就可以很明確的知道父子階的關係~~~

    select distinct * from tablea,tableb where tablea.bno=tableb.bno

    Source(s): ME
  • 1 decade ago

    1. 不是真的瞭解您的問題

    2. SQL有一些集合的語法

    >union

    Select~

    union

    Select~

    會把上下兩組select結果合併全部列出來,重複的部分只列出一次

    union all 重複的部分也會列出

    >minus

    Select~

    minus

    Select~

    只列出上面有、下面沒有的列出來

    >interset

    Select~

    interset

    Select~

    只列出上下都有的部分

    提供您參考試試,希望有幫助~

    Source(s): 自己的經驗
  • W.B.G
    Lv 6
    1 decade ago

    其實搞不太懂你的意思,我覺得你的題目要描述的意思是不是

    當選擇A時會出現A1、A2、A3…等A的子類別,選擇B時會出現屬於B的子類別。

    重覆的意思是說如果已經有A1這個選項時,就不讓他加入嗎?或是不讓他顯示出來??

    請問這樣對嗎?如果是這樣的話,我再寫給你參考

    2007-01-24 11:58:09 補充:

    其實最簡單的方式就是在子類別的資料表中多加一個欄位叫PID,用來記父類別的ID,例如:父類別A的ID是1,那子類別A1、A2、A3的PID欄位就=1,

    $SQL="select * from 父類別 where ID=1";

    $RETURN=mysql_query($SQL);

    $CLASS1=mysql_fetch_array($RETURN);

    2007-01-24 11:58:43 補充:

    $sql="select * from 子類別 where PID=1"

    $RETURN=mysql_query($sql);

    while($CLASS2=mysql_fetch_array($RETURN)){

    .......

    }

    字數的限制,子類別在這邊,接在父類別下面就行了

    Source(s): 自己, 自己的經驗, 自已
Still have questions? Get your answers by asking now.