2012-11-03 318 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