2014-02-17 48 views
-1

我有2代表的客戶,類別如何獲得使用逗號操作在MySQL從另一個表的細節

類別:

category_id category_name  vendor_id 

     1    laptops  10 

     2    bikes   10 

     3    cars   10 

客戶:

user_name  password assigned_categories vendor_id 

    nag  12345   1,2,3   10 

當我與USER_NAME登錄並密碼...我需要從類別中獲取所有category_id,category_name。但是隻能獲得第一類的詳細信息,如

category_id=1,category_name=laptops 
+0

你在說什麼?完全困惑。 – Raptor

+0

那麼,如果你沒有發佈任何關於你的實際代碼的東西,那麼你如何期待任何人來幫助你? – arkascha

+0

發佈你的代碼,你到目前爲止嘗試了什麼。 – InnocentKiller

回答

0

您的客戶表不遵守First Normal Form,因爲您在assigned_categories屬性中存儲了多個值。如果要創建一個新表customer_assignments,則可以使用基本的SQL命令輕鬆完成。

下面介紹如何在新表customer_assignments看起來:

USER_NAME(FK)

CATEGORY_ID(FK)

PRIMARY KEY(USER_NAME,CATEGORY_ID)

Many-to-Many relationships應像這樣處理,而不是通過將多個值添加到一個屬性中。

然後,您可以用類似的查詢提取您所需的信息:

SELECT category_id, category_name 
FROM (category NATURAL JOIN customer_assignments) NATURAL JOIN customer 
WHERE user_name = your_current_user_name 
+0

如何遵守1NF的客戶表 – user3318237

+0

刪除assigned_categories屬性並創建上面提到的表。 –

+1

我知道了......感謝 – user3318237

0

如果你不改變你的結構,那麼下面的查詢將有助於你得到你需要的結果

DECLARE @Test VARCHAR(MAX) = '' 
SELECT SET @Test = assigned_categories FROM customer WHERE user_name = 'nag' 
IF LEN(@Test) > 0 
BEGIN 
     CREATE TABLE #Temp(category_id VARCHAR(MAX)) 
     WHILE LEN(@Test) > 0 
      BEGIN 
      IF CHARINDEX(',',@Test) > 0 
      BEGIN 
      INSERT INTO #Temp VALUES(LEFT(@Test,CHARINDEX(',',@Test)-1)) 
      SET @Test = SUBSTRING(@Test,CHARINDEX(',',@Test) + 1,LEN(@Test)) 
      END 
      ELSE 
      BEGIN 
      INSERT INTO #Temp VALUES(@Test) 
      SET @Test = '' 
       END 
      END 
     SELECT * FROM category INNER JOIN #Temp ON category.category_id = #Temp.category_id 
END 
0

也許使用SQL IN operator可能會有幫助,它允許您在WHERE子句中指定多個值。

+0

這將不起作用,因爲它仍然會將單個記錄與單個記錄進行比較,並且任何數字都會與「1,2,3」不同。 –

相關問題