2012-11-03 228 views
-1

好的人。我有一个带有id,categoryname的表类别。PHP和MYSQL选择

类别有:id = 1 categoryname = batteries,id = 2 categoryname = flash,id = 3 categoryname glasses。

第二张表是用户。用户有id,user_eimal,my_choices。 每个用户都有存储到my_choices中想要出现的类别名称。

因此,例如,用户乔治USER_EMAIL [email protected]在my_choices店:电池,眼镜

现在我想提出从表中产品记录,其中类别名称是用户乔治存入my_choices值。

产品有标识,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>'; 
} 

?> 
+0

正常化你的表....不要用逗号分隔的列表中的产品表中,但创建一个单独的product_categories表,否则会导致自己不幸发生在未来 –

+0

请可你给我一个adivise如何我可以做到这一点? –

+1

问题通常在其中有一个'?',而不仅仅是一个需求列表。我们在这里帮助,而不是为你做你的工作,我们也不是雇用的代码人。 –

回答

5

您想使用连接表,以便您可以拥有多对多的关系。您目前的结构更适合每个用户只有一个选择。

你要什么有三个表:

  • 用户(用户ID,USER_NAME,USER_EMAIL)
  • 分类(的categoryID,CATEGORY_NAME)
  • Users_Categories(用户ID,的categoryID)

所以使用你的例子,你的三个表格看起来像这样(如果有人知道在这里演示SQL表格的更好方法,请告诉我):

用户

分类

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

Users_Categories

  • 用户ID:1 | categoryID:1
  • userID:1 |的categoryID:3

然后,您可以使用select语句和join条款让乔治和他的类别:

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

这将在结果中返回两行:

  1. 乔治,电池
  2. George,Glasses

根据您想要对该数据执行的操作,最好还可以选择用户ID。

如果你想要一个只返回一行所有信息的查询,它会变得有点棘手。您必须使用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 

对于你最后关于产品的问题,你会遵循相同的逻辑与更多的连接。您的产品表需要产品ID,产品名称和类别ID。

+1

一个非常好的建议,这将使产品轻松搜索。此外,它不会限制产品可能具有的类别数量。 Upvoted。 –

+2

+1用于回答OP关于标准化的后续行动。 –

0
$trt = mysql_query ("select * from products where categoryname = 'batteries' OR categoryname = 'glasses'"); 
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而不是类别名称。

+0

我不认为这是OP中的一个正确例子,因为'categoryname'是逗号分隔的多个值集合。如果它是一个单一的价值领域,它会起作用。 –

0

使用爆炸功能

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

现在阵列[0]和阵列[1]具有2倍的值。然后用

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

MySQL查询$结果必须是动态因为我不知道“或”有多少值..我是否正确? –

+0

我不确定我是否收到您的问题。如果您试图告诉您不知道要添加的OR语句的数量,则可以编写如下循环: '$ i = 0; (isset($ array [i])) – demonslayer

+0

soory约前一个,它是不完整的 我不知道如果我得到您的问题。如果您试图告诉您不知道要添加的OR语句的数量,则可以编写如下循环: '$ i = 0; (isset($ array [i])) $ data = $ data。“OR”。$阵列[$ i]于; ' 然后将它包含在你的sql查询中 – demonslayer