2012-01-24 2 views
1

PHP 변수 $ accountnumber를 프로필 페이지를 보는 사용자의 것으로 설정했습니다. 이 페이지에는 데이터베이스에서 채워지는 사용자 정보가 포함 된 블록이 있으며 우리가 가지고있는 모든 제품의 목록이 있으며 고객이 가지고있는 제품 옆에 체크 표시를하고 싶습니다. 그것. 여기 SQL 테이블의 모든 레코드를 표시하고 해당 레코드를 다른 테이블과 일치시키는 방법은 무엇입니까?

내 테이블입니다 :

products 
id | name | url | weight 
100 p1  p1.html 1 
101 p2  p2.html 2 
102 p3  p3.html 3 
103 p4  p4.html 4 
104 p5  p5.html 5 
105 p6  p6.html 6 

products_accounts 
account_number | product_id 
0000001   100 
0000001   104 
0000001   105 
0000002   101 
0000002   103 
0000002   104 
0000002   105 
0000003   100 
0000003   102 

나는 왼쪽 외부 조인하려고했으나 $의 ACCOUNTNUMBER 특정 PRODUCT_ID의 products_accounts 테이블에 ACCOUNT_NUMBER 일치 여부를 결정 할 수 없습니다. 나는이 작업을 수행 할 수 있었다있는 유일한 방법은이 같은 WHERE 문을 추가했다 :

WHERE products_acccounts.account_number = '$accountnumber' 

그것은 제품에 적절한 클래스를했다,하지만 그들 만이 아닌 모두의 한 제품을 보여 주었다. 여기

내 코드입니다 : 고객이 P2와 P5를 제외한 모든 제품이있는 경우

$sql =" 
SELECT 
    products.id, 
    products.name, 
    products.url, 
    products_accounts.account_number 
FROM 
    products 
LEFT OUTER JOIN 
    products_accounts 
ON 
    products.id = products_accounts.product_id 

"; 

$sql .=" 
GROUP BY 
    products.id 
ORDER BY 
    products.weight 
"; 

$result = mysql_query($sql); 
while($row = mysql_fetch_array($result)) { 
    echo '<span class="'; if($row['account_number'] == '$accountnumber') 
    { echo'product_yes">'; } else { echo 'product_no">'; } 
    echo '<a href="' . $row['url'] . '">' . $row['name'] . '</a><br /></span>'; 
} 

, 그것은 다음과 같이 표시되어야합니다 :

✓P1

P2 

✓P3 

✓P4 

P5 

✓P6 

답변

0
$getproducts = mysql_query(" 
SELECT id, name, url 
FROM products 
ORDER BY weight ASC"); 

while ($rowproducts = mysql_fetch_assoc($getproducts)) { 

$product_id = $rowproduct['id']; 
$product_name = $rowproduct['name']; 
$product_url = $rowproduct['url']; 

$getuserhasproduct = mysql_query(" 
SELECT DISTINCT product_id 
FROM products_accounts 
WHERE account_number = $accountnumber 
AND product_id = $product_id"); 
$user_has_product = mysql_num_rows($getuserhasproduct); 

if($user_has_product){ 
$class = "checked"; 
} 

echo "<span class='$class'><a href='$product_url'>$product_name</a></span>"; 
unset($class); 
} // end loop 

$getproducts = mysql_query("SELECT id, name, url, 
(SELECT DISTINCT product_id 
FROM products_accounts 
WHERE account_number = '$accountnumber' 
AND product_id = products.id) AS product_count 
FROM products 
ORDER BY weight ASC"); 

while ($rowproducts = mysql_fetch_assoc($getproducts)) { 

$product_id = $rowproduct['id']; 
$product_name = $rowproduct['name']; 
$product_url = $rowproduct['url']; 
$product_count = $rowproduct['product_count']; 

if($product_count > 0){ 
$class = "checked"; 
} 

echo "<span class='$class'><a href='$product_url'>$product_name</a></span>"; 
unset($class); 
} // end loop 
+0

나는 이것에 관해 좋은 느낌을 가지고 있었다! :) 그리고 나는 옳았다! 당신이 옳았! 이것을 복사하여 텍스트 편집기에 붙여 넣기 만하면 3 가지 작업 만 완료하면됩니다! _1. while 문과 일치하는 복수형 "rowproducts"의 인쇄상의 오류를 수정했습니다 ...... _ _2. "WHERE account_number = '$ accountnumber'AND product_id = '$ product_id'"값의 작은 따옴표를 추가했습니다. ...... _3. $ 클래스를 이미 설정 한 항목에 변경하고 " _ – nitsuj

+0

클래스 1을 고쳐야한다는 것을 알았습니다. 두 번째 픽스가 필요했는지는 확실하지 않았지만 항상 정상적으로 작동했기 때문에 MySQL이 펑키 할 수 있습니다. 첫 번째 편집, 즉 빠르게 입력하고 작업하는 동안 나는이 웹 사이트에 있지 않은 것처럼 행동하는 것입니다. – bowlerae

+0

그래, 필요하지 않았는데, 모든 것이 검사되었다. 왼쪽 외부를 시도하기 전에 나의 첫번째 시도. 조인은이 메서드의 무언가를 수행하는 것이 었습니다 - while 문에 쿼리를 넣는 것이 었 습니다만, 저는 그 방법이 모두 잘못되었다고 생각했기 때문에 그것을 올바르게 처리하지 않았습니다.이를 지워 줘서 고마워요! – nitsuj

0

에게 당신을 GROUP BY을 문맥에서 사용하려고하면 모든 것을 검색하고 싶지 않습니다. 기록들. GROUP BY 절은 데이터를 집계 (예 : 여러 레코드의 합계, 평균 등을 얻으려는 경우)하는 경우에만 사용해야합니다.

+0

아니, 만약 내가'GROUP을 사용하지 않는 성능에 도움이 될 수 BY' , products_accounts 테이블에 표시된 횟수만큼 각 제품을 표시합니다. – nitsuj

+0

각 제품을 한 번에 표시하고 싶습니다. 사용자가 가지고있는 제품의 경우 해당 제품에 클래스를 적용해야합니다. P2와 P5를 제외한 모든 제품을 가진 사용자에 대해 , 그것은 다음과 같이 표시 될 것이다 : '✓P1 P2 ✓P3 ✓P4 P5 ✓P6' – nitsuj

+0

@nitsuj : 당신은 사용할 수 없습니다 '그룹을 BY'를 선택하고 집계되지 않은 열 데이터를 선택하십시오. 결과는 의미가 없습니다 ... – FtDRbwLXw6

1
SELECT 
    products.id, 
    products.name, 
    products.url, 
    products_accounts.account_number 
FROM 
    products 
LEFT OUTER JOIN 
    (SELECT * FROM products_accounts WHERE account_number = $account_number) as products 
ON 
    products.id = products_accounts.product_id 
WHERE 
"; 

$sql .=" 
GROUP BY 
    products.id 
ORDER BY 
    products.weight 
"; 

나는 이것이 답변이라고 생각합니다. 조인 전에 조인 테이블을 필터링해야합니다. 나는 PHP에 익숙하지 않은 구문을 확인하시기 바랍니다.

2

그것은 다음과 같은 PHP보다 SQL을 사용하여 행을 필터링하는 것이 좋습니다 :

$sql =" 
SELECT 
    p.id, 
    p.name, 
    p.url, 
    pa.account_number 
FROM 
    products p 
LEFT OUTER JOIN 
    products_accounts pa 
ON 
    p.id = pa.product_id 
    AND 
    pa.account_number = ".mysql_real_escape_string($accountnumber)." 
ORDER BY 
    p.weight 
"; 


$result = mysql_query($sql); 
while($row = mysql_fetch_array($result)) { 
    echo '<span class="'; if(!is_null($row['account_number'])) 
    { echo'product_yes">'; } else { echo 'product_no">'; } 
    echo '<a href="' . $row['url'] . '">' . $row['name'] . '</a><br /></span>'; 
} 
관련 문제