PHP和MYSQL选择

Geo*_* L. -1 php mysql

好的伙计们.我有一个id,categoryname的表类别.

类别有:id = 1 categoryname =电池,id = 2 categoryname =闪烁,id = 3 categoryname眼镜.

第二个表是用户.用户有id,user_eimal,my_choices.每个用户都在my_choices中存储了想要显示的类别名称.

因此,例如用户George和user_email xxxxx@xxx.com存储在my_choices中:电池,眼镜

现在我想从表产品中调出记录,其中categoryname是用户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>'; 
}

?>
Run Code Online (Sandbox Code Playgroud)

Dav*_*ier 5

您希望使用连接表,以便可以建立多对多关系.您当前的结构更适合每个只有一个选择的用户.

你想要的是三个表:

  • 用户(userID,user_name,user_email)
  • 类别(categoryID,category_name)
  • Users_Categories(userID,categoryID)

因此,要使用您的示例,您的三个表将如下所示(如果有人知道在这里演示SQL表的更好方法,请告诉我):

用户

  • userID:1 | user_name:George | user_email:george@example.com

分类

  • categoryID:1 | category_name:电池
  • categoryID:2 | category_name =闪烁
  • categoryID:3 | category_nameglasses.

Users_Categories

  • userID:1 | categoryID:1
  • userID:1 | categoryID: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
Run Code Online (Sandbox Code Playgroud)

这将返回结果中的两行:

  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
Run Code Online (Sandbox Code Playgroud)

对于有关产品的最后一个问题,您可以使用更多连接遵循相同的逻辑.您的Products表希望拥有productID,product_name和categoryID.

  • +1用于回答OP关于规范化的后续行动. (2认同)