-1

わかりました。ID、カテゴリ名のテーブルカテゴリがあります。

カテゴリには、id=1 カテゴリ名 = 電池、id=2 カテゴリ名 = フラッシュ、id=3 カテゴリ名 メガネがあります。

2 番目のテーブルはユーザーです。ユーザーには、id、user_eimal、my_choices があります。すべてのユーザーは、表示したいカテゴリ名を my_choices に保存しています。

たとえば、user_email xxxxx@xxx.com を持つユーザー George は、my_choices にバッテリー、メガネのストアを持っています。

ここで、カテゴリ名がユーザー george が my_choices に保存した値であるテーブル製品からレコードを表示したいと考えています。

製品には id、p_title、categoryname があります

たとえば、私はしたい:

 <?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>'; 
}

?>
4

4 に答える 4

5

結合テーブルを使用して、多対多の関係を構築したいと考えています。現在の構造は、選択肢が 1 つしかない各ユーザーにより適しています。

必要なのは、次の 3 つのテーブルです。

  • ユーザー (userID、user_name、user_email)
  • カテゴリー (categoryID、category_name)
  • Users_Categories (ユーザー ID、カテゴリ ID)

したがって、あなたの例を使用すると、3 つのテーブルは次のようになります (ここで SQL テーブルを示すより良い方法を誰かが知っている場合は、私に知らせてください)。

ユーザー

  • ユーザーID: 1 | ユーザー名: ジョージ | user_email: george@example.com

カテゴリー

  • カテゴリーID: 1 | カテゴリ名: 電池
  • カテゴリーID: 2 | カテゴリ名=点滅
  • カテゴリーID: 3 | category_nameglasses.

ユーザー_カテゴリ

  • ユーザーID: 1 | カテゴリID: 1
  • ユーザーID: 1 | カテゴリID: 3

次に、 join句を指定した select ステートメントを使用して、George と彼のカテゴリを取得します。

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

これにより、結果として 2 つの行が返されます。

  1. ジョージ、バッテリー
  2. ジョージ、メガネ

そのデータで何をしたいかによっては、userID も選択した方がよい場合があります。

すべての情報を含む 1 つの行のみを返すクエリが必要な場合は、少し複雑になります。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

製品に関する最後の質問については、結合を増やして同じロジックに従います。Products テーブルには、productID、product_name、および categoryID が必要です。

于 2012-11-03T21:22:12.833 に答える
0
$trt = mysql_query ("select * from products where categoryname = 'batteries' OR categoryname = 'glasses'");
于 2012-11-03T21:19:14.963 に答える
0

あなたの場合、selectステートメントを次のように使用します

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 を使用することをお勧めします。

于 2012-11-03T21:20:58.880 に答える
0

爆発機能を使う

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

現在、array[0] と array[1] には 2 つの値があります。次に使用します

$result = mysql_query ("select * from products where categoryname = '".$array[0]."' OR categoryname = '".$array[1]."'");
于 2012-11-03T21:24:34.533 に答える