2016-01-21 78 views
1

我有一個表,其中一列包含一個逗號分隔值。 我需要在查詢中獲取這些值,將它們分解並對另一個表執行查詢。MySQL查詢從數組值查詢另一個表

讓我解釋一下結構。

表1:課程。 列大家都擔心這個例子:

courses.id, courses.products 

這將返回一個值

$query['id']-> 1000 
$query['products']-> 1,5 

內查詢我需要拉的產品名稱從產品表中的每個產品

所以

products.productname 

即使我必須創建5 p查詢中的roductname列,因爲沒有人應該有超過5個產品。

所有這一切的關鍵是我必須將其轉儲到電子表格中,並且我需要在其中包含產品名稱。

要完成CSV轉儲我有這個代碼。 (我已經查詢書面不過現在剛剛返回「1,5」,而不是產品名稱

$query = " QUERY GOES HERE "; 
$result = mysql_query($query, $db) or die(mysql_error()); 
if (!$result) die('Couldn\'t fetch records'); 
$num_fields = mysql_num_fields($result); 
$headers = array(); 
for ($i = 0; $i < $num_fields; $i++) 
{  
     $headers[] = mysql_field_name($result , $i); 
} 
$fp = fopen('php://output', 'w'); 
if ($fp && $result) 
{  
     header('Content-Type: text/csv'); 
     header('Content-Disposition: attachment; filename="export.csv"'); 
     header('Pragma: no-cache');  
     header('Expires: 0'); 
     fputcsv($fp, $headers); 
     while ($row = mysql_fetch_row($result)) 
     { 
     fputcsv($fp, array_values($row)); 
     } 
die; 
} 
+0

請[停止使用'mysql_ *'函數](http:// stackoverflow。COM /問題/ 12859942 /爲什麼 - 不應該,我使用MySQL的函數功能於PHP)。 [這些擴展](http://php.net/manual/en/migration70.removed-exts-sapis.php)已在PHP 7中刪除。瞭解[編寫]​​(http://en.wikipedia.org/ wiki/Prepared_statement)語句[PDO](http://php.net/manual/en/pdo.prepared-statements.php)和[MySQLi](http://php.net/manual/en/mysqli.quickstart .prepared-statements.php)並考慮使用PDO,[這真的很簡單](http://jayblanchard.net/demystifying_php_pdo.html)。 –

+0

謝謝託尼。我知道。這個應用程序是龐大的和書面的,以便每個頁面的查詢在頂部而不是基於功能的中央位置。它開始在DreamWeaver中開發,並已發展成爲一個龐大的系統。我的第一個目標之一是轉移到基於功能的系統,因此不會在每頁基礎上處理查詢或sql操作。 – phpman13

回答

0

您的情況下迅速解決:

$course_id = intval($_GET['id']); 
// get the id 1000 
$result = mysql_query("SELECT `products` FROM `courses` WHERE `id`=" . $course_id); 
$course = mysql_fetch_assoc($result) or exit("Invalid ID"); 
$result = mysql_query("SELECT `id`,`productname` FROM `products` WHERE `id` IN (".$course['products'].")"); 
// this will result in "SELECT id,productname FROM products WHERE id IN (1,5)" 
// 
// rest of your code 

如果不導出數據每隔一秒左右你應該對這兩個查詢很好

現在你會體驗到爲什麼它是不好的數據庫設計在單個數據庫字段中存儲逗號分隔的多個值如果你正在重構應用程序,這將是一個很好的時間重構數據庫並存儲每個數據庫產品< - >課程從屬於一行。如果您courses表只有這兩列,你可以做這樣的:

id | product 
-------------- 
1000 | 1 
1000 | 5 

如果你的表有與課程相關的多個字段,你應該列products移動到其自己的表如上圖所示。這是多對多關係的常用數據庫結構。

最初我希望通過其中一個查詢來獲得結果,但由於某種原因,我總是隻有一條記錄,而我目前沒有時間深入研究。

-- try #1 
SELECT products.id,products.productname 
FROM products JOIN courses ON products.id IN (courses.products) 
WHERE courses.id=1000 

-- try #2 
SELECT products.id,products.productname 
FROM products 
WHERE products.id IN (
    SELECT courses.products 
    FROM courses 
    WHERE courses.id=1000 
) 

最後,但並非最不重要,你已經給出的建議停止使用過時的mysql_*功能。我知道重寫現有的應用程序很困難,我自己也一直在這條路上。我的經驗是,最好一直這樣做,只要使用mysqli或PDO定義第二個數據庫連接,無論你更適合。每當你改變腳本中的相關數據庫時,用新的API重寫它。當你這樣做的時候,你會有更多的開銷,但不是很明顯,它比一次重寫所有東西都容易。