2012-11-03 2 views
-1

여러분. id, categoryname이있는 테이블 범주가 있습니다.PHP 및 MYSQL 선택

카테고리는 다음과 같습니다. id = 1 categoryname = batteries, id = 2 categoryname = 깜박임, id = 3 categoryname 안경.

두 번째 테이블은 사용자입니다. 사용자는 id, user_eimal, my_choices를가집니다. 모든 사용자는 표시하려는 카테고리 이름을 my_choices에 저장합니다. 범주 사용자 조지가 my_choices에 저장 한 값입니다 배터리, 안경

지금은 테이블 제품의 레코드를 가지고 싶어 : USER_EMAIL [email protected]에 따라서 예를 들어, 사용자가 조지에 대한

는 my_choices의 저장소가 있습니다 .

제품은 내가 원하는 예를 들어 ID, p_title, 범주

을 가진다 :

<?php 

    $usenmail = $_SESSION['SESS_EMAYL_NAME']; 

    $q1 = "SELECT * FROM categories WHERE id = '$id'"; 
    $q2 = mysql_query($q1, $connectiondb) or die(mysql_error()); 
    $results = mysql_fetch_assoc($q2); 

    $my_choices = $results['my_choices']; //That means $my_choices = batteries,glasses 

    //Now i want to select fom my table poducts only the categories (batteries,glasses)that user has store. 

$trt = mysql_query ("select * from products where categoryname = batteries,glasses"); 

while($apst = mysql_fetch_assoc($trt)) { 

echo '<div style="color: #000; float: left;">Productname: '.$['apst'].'</div>'; 
echo '<br>'; 
} 

?> 
귀하의 경우 사용과 같은 SELECT 문에서
+0

그렇지 않으면 미래 –

+0

자신에게 슬픔의 끝을 수 있습니다하십시오 원인이없는 것, 제품 테이블에 쉼표로 구분 된 목록을 사용하지만 별도의 product_categories 테이블을 생성하지 않는 .... 테이블을 정규화 사용 내가 어떻게 할 수 있니? –

+1

질문에는 일반적으로 요구 사항 목록이 아닌 '?'가 포함되어 있습니다. 우리는 당신을 돕기 위해 당신의 직업을 돕기 위해 여기에 온 것이 아닙니다. –

답변

5

다 대다 관계를 가질 수 있도록 조인 테이블을 사용하고자합니다. 현재 구조는 오직 하나의 선택 만하는 각 사용자에게 더 적합합니다.

  • 사용자 (아이디, USER_NAME, USER_EMAIL)
  • 카테고리 (카테고리 ID, 범주 이름)
  • Users_Categories (아이디, 카테고리 ID) 그래서

: 당신이 원하는 무엇

세 테이블입니다 귀하의 예제를 사용하려면 세 테이블은 다음과 같습니다 (아무도 SQL 테이블을 더 잘 보여줄 수 있다면 알려주십시오.)

사용자

카테고리

  • 카테고리 ID : 1 | category_name : 배터리
  • categoryID : 2 | category_name = 깜박임
  • categoryID : 3 | category_nameglasses.

Users_Categories

  • 아이디 : 1 | categoryID : 1
  • userID : 1 | 카테고리 ID : 3
그런 다음 조지와 그의 카테고리를 얻을 수있는 join 절을 select 문을 사용

:

SELECT 
    user_name, 
    category_name 
FROM 
    Users 
    LEFT JOIN Users_Categories USING (userID) 
    LEFT JOIN Categories USING (categoryID) 
WHERE 
    userID = 1 

이 결과에서 두 개의 행을 반환 :

  1. 조지 , 배터리
  2. 조지, 안경

해당 데이터로 수행 할 작업에 따라 userID를 선택하는 것이 좋습니다.

모든 정보가 포함 된 한 행만 반환하는 쿼리를 원하면 좀 더 까다로워집니다. GROUP BY 기능을 사용해야합니다. 그러면 다음과 같이 보입니다.

SELECT 
    user_name, 
    GROUP_CONCAT (category_name ',') 
FROM 
    Users 
    LEFT JOIN Users_Categories USING (userID) 
    LEFT JOIN Categories USING (categoryID) 
GROUP BY 
    userID 
WHERE 
    userID = 1 

제품에 대한 최종 질문은 더 많은 조인을 사용하여 동일한 논리를 따르십시오. 제품 테이블에 productID, product_name 및 categoryID가 있어야합니다.

+1

아주 좋은 제안입니다. 이렇게하면 제품을 쉽게 검색 할 수 있습니다. 또한 제품이 가질 수있는 범주의 양을 제한하지 않습니다. Upvoted. –

+2

+1 정규화에 관한 OP의 추후 답변에 대해서는 +1. –

0
$trt = mysql_query ("select * from products where categoryname = 'batteries' OR categoryname = 'glasses'"); 
0

,

select * from products where categoryname in ('batteries','glasses'); 

즉,

//add quotes to category names (if ids you dont neeed these 2 lines) 
$cats=explode(',',$my_choices); 
$strcats = "'" . join("', '", $cats) . "'"; 

$trt = mysql_query ("select * from products where categoryname in ($strcats)); 

카테고리 이름 대신 카테고리 ID를 사용하도록 제안합니다.

+0

'categoryname'은 쉼표로 구분 된 여러 값들의 집합이기 때문에 이것이 OPs의 올바른 예라고 생각하지 않습니다. 단일 값 필드이면 작동합니다. –

0

사용 기능을 폭발

$array = explode(','$my_choices); 

이제 어레이 [0]과 배열 [1] 2 개 값을 갖는다. 다음

$result = mysql_query ("select * from products where categoryname = '".$array[0]."' OR categoryname = '".$array[1]."'"); 
+0

mysql query $ 결과는 동적 인 것이어야합니다. "또는"얼마나 많은 값이 있습니까? –

+0

질문이있는 경우 확실하지 않습니다. 추가 할 OR 문 수를 알지 못한다는 것을 알리려고하면 다음과 같은 루프를 작성할 수 있습니다 : '$ i = 0; while (isset ($ array [i]))' – demonslayer

+0

이전 글에 대한 불만 사항은 불완전합니다. 질문이있는 경우 확실하지 않습니다. 추가 할 OR 문 수를 알지 못한다는 것을 알리려고하면 다음과 같은 루프를 작성할 수 있습니다 : '$ i = 0; while (isset ($ array [i])) $ data = $ data. "OR".$ array [$ i]; ' 다음 SQL 쿼리에 포함 – demonslayer