2014-02-17 6 views
-1

MySQL의 쉼표 연산자를 사용하여 다른 테이블에서 세부 카테고리를 얻는 방법내가 2 개 테이블 고객이

카테고리 :

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 

내가 _ 이름으로 로그인하고 비밀번호 ... 카테고리에서 모든 category_id, category_name을 가져와야합니다. 그러나 첫 번째 카테고리 세부 정보는

01과 같습니다.
+0

무슨 말씀 이세요? 완전히 혼란 스럽다. – Raptor

+0

실제 코드에 대해 아무 것도 게시하지 않으면 누구에게 도움을 줄 수 있습니까? – arkascha

+0

코드도 올리십시오. 지금까지 시도한 것은 무엇입니까? – InnocentKiller

답변

0

assigned_categories 특성에 여러 값을 저장하기 때문에 고객 테이블이 First Normal Form을 준수하지 않습니다. customer_assignments 테이블을 새로 만들려면 기본 SQL 명령을 사용하면 쉽게 완료 할 수 있습니다. 여기

는 새 테이블 customer_assignments이 보일 것이다 방법은 다음과 같습니다

_ 이름 (FK)

CATEGORY_ID (FK)

PRIMARY KEY (_ 이름, 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"과 다를 수 있으므로 작동하지 않습니다. –