2017-07-27 111 views
1

我遇到了MySQL查詢或我的邏輯問題。在某些字段中使用具有多個值的MySQL查詢創建表

我需要使用我的DATABASE中的值創建一個html表。但是在我的桌子的一些領域可以是一個多重價值。我應該如何製作我的桌子?我可以在一個查詢中完成它,還是應該在表完成後執行第二個查詢?

下面是表:

offers: 
id | rid | name 
------------------------------ 
1 | 1234 | mary 
2 | 1235 | john 
3 | 5342 | liam 

geo_in_off: 
offer_id | geo_id 
------------------------------ 
1  | 1 
1  | 2 
3  | 3 

有些優惠可以有2分地理的。所以我需要一個htm ltable應該是這樣的:

No | rid | name | geo 
---------------------------------- 
1 | 1234 | mary | 1, 2 

,但我得到與dublicates表看起來像:

No | rid | name | geo 
---------------------------------- 
1 | 1234 | mary | 1 
2 | 1234 | mary | 2 

我怎樣才能解決這個問題?

這裏是我的代碼:

require('../config.php'); 
$sql ="SELECT * FROM `offers` LEFT JOIN `geo_in_off` ON `geo_in_off`.`offer_id` = `offers`.`id` ORDER BY `offers`.`rid`"; 
$result = mysql_query($sql) or die(mysql_error()); 

while ($row=mysql_fetch_assoc($result)) { 
echo "<tr><td>" . $i . "</td><td class=\"editable\">" . $row['rid'] . "</td><td class=\"editable\">" . $row['name'] . "</td><td>" .$row['geo_id'] . "</td></tr>" ; 
$i++; 
} 

這裏是config.php文件:

$db_name = "dbname"; 
$db_user = "user"; 
$db_pass = "pass"; 
$db_connect = mysql_connect('localhost', $db_user, $db_pass); 
$selected = mysql_select_db($db_name, $db_connect); 
@mysql_query('set character_set_results="utf8"'); 
@mysql_query('set collation_connection="utf8_general_ci"'); 
@mysql_query('set character_set_client="utf8"'); 
+0

您需要實現什麼作爲一個_Control break_。基本上,您將當前記錄的相關字段與最後一個記錄的相關字段進行比較,並根據它們是否相同,決定做什麼。或者,您可以先將數據放入數組中,然後按照自己的喜好進行排列,使用rid作爲鍵,然後遍歷該數組以輸出所需的HTML表。 – CBroe

回答

0

1:使用group_concatgroup by條款

GROUP_CONCAT()將返回與串接一串non-NULL價值從group

SELECT offers.rid,offers.name,group_concat(geo_in_off.geo_id) 
FROM `offers` 
LEFT JOIN `geo_in_off` 
ON `geo_in_off`.`offer_id` = `offers`.`id` 
GROUP BY `offers`.`rid`,offers.name 
ORDER BY `offers`.`rid` 

注:GROUP_CONCAT功能默認分離器是comma(,)。也能夠使用custom之一。

第二:mysql_*deprecated嘗試使用mysqli_*

3:也可以嘗試使用pdo or prepared statement

PHP:

require('../config.php'); 


$sql ="SELECT `offers`.`rid` as Rid ,`offers`.`name` as Name ,group_concat(geo_in_off.geo) as geos 
     FROM `offers` 
     LEFT JOIN `geo_in_off` 
     ON `geo_in_off`.`offer_id` = `offers`.`id` 
     GROUP BY `offers`.`rid`,`offers`.`name` 
     ORDER BY `offers`.`rid`"; 

$stmt = $conn->prepare($sql); 
$stmt->execute(); 
$get_result =$stmt->get_result(); 
$row_count= $get_result->num_rows; 

if($row_count>0){ 

    echo "<table><thead><tr><th>No</th><th>Rid</th><th>name</th><th>goes</th></tr></thead><tbody>"; 
    $i=0; 
    while ($row=$get_result->fetch_assoc()) { 

     echo "<tr><td>" . $i . "</td><td class=\"editable\">" . $row['Rid'] . "</td><td class=\"editable\">" . $row['Name'] . "</td><td>" .$row['geos'] . "</td></tr>"; 
     $i++; 

    } 

    echo "</tbody></table>"; 

} 

的config.php

$db_name = "dbname"; 
$db_user = "user"; 
$db_pass = "pass"; 
$conn = mysqli_connect('localhost', $db_user, $db_pass,$db_name) or die('error'.mysqli_connect_error()); 
mysqli_query($conn,'set character_set_results="utf8"'); 
mysqli_query($conn,'set collation_connection="utf8_general_ci"'); 
mysqli_query($conn,'set character_set_client="utf8"'); 
+0

謝謝你,我的主人很不客氣!但是,你能告訴我,現在如何獲得HTML表格中的geos? (的PHP代碼) – mrdeath4

+0

@Downvoter你能解釋爲什麼它應得的downvote。所以我可以糾正我的錯誤。 – JYoThI

+0

您不能選擇不屬於分組的一部分,這是SQL中的錯誤。在MySQL中,它被視爲嚴格配置中的錯誤,否則您將爲組中的「隨機」記錄獲取這些列的值。 – CBroe

0

您應該使用單獨的表格用於存儲「geo」的值。多值屬性導致數據庫中存在數據冗餘,並且違反了數據庫範式。

No | rid | name | 
---------------------------------- 
1 | 1234 | mary | 
2 | 1234 | mary | 

No | geo | foreigh_key | 
---------------------------------- 
    1 | 1 | 1 | 
    2 | 2 | 1 | 
+0

我認爲他們已經有了,問題僅僅是以所需的格式輸出數據。 – CBroe

相關問題