2013-03-11 80 views
0

我有一些价值观连字符分隔的一排:连字符分隔的值和LEFT_JOIN

表:live_customers
行:地区

id | areas 
1 | 10-20-30 
2 | 40-50-60 
... 

使用此...

LEFT JOIN $table5 AS table5 ON live.areas REGEXP CONCAT('(^|-) ?',table5.id,' ?($|-)') 

我的结果看起来像:

(tab id:1) area: 10 
(tab id:1) area: 20 
... 
(tab id:2) area: 40 
... 

但我相信:

(tab id:1) area: 10,20,30 
(tab id:2) area: 40,50,60 

我怎么能解决?

编辑:

完整的查询看起来像:

SELECT live.*, 
live.id AS lid, 
table1.id, table1.value AS tn_val, 
table2.id, table2.value AS tp_val, 
table3.id, table3.value AS ht_val, 
table5.id, table5.value AS ar_val 
FROM $dblist AS live 
LEFT JOIN $table1 AS table1 ON live.town = table1.id 
LEFT JOIN $table2 AS table2 ON live.htype = table2.id 
LEFT JOIN $table3 AS table3 ON live.ht = table3.id 
LEFT JOIN $table5 AS table5 ON live.areas REGEXP CONCAT('(^|-) ?',table5.id,' ?($|-)') 
ORDER BY live.id ASC 

PHP呼应:

... 
if ($post['areas']){ // Debugging areas stuff 
echo '<strong>'.$_areas.': (ar_val)</strong> '.$post['ar_val'].'<p>'; 
echo '<strong>'.$_areas.': (areas)</strong> '.$post['areas'].'<p>'; 
} 
... 

EDIT2:

这是相当我很难解释英语我的问题,但我想尽我所能:)

表中的“live_customers”我确实有这样的:

id | areas 
1 | 10-20-30 
2 | 40-50-60 
... 
表中的“区域”

(这是一个完全不同的表):

id | value 
38 | Zone1 
39 | Zone2 
40 | Zone3 
... 

在你看到的只是SQL查询表变量,因为我previousvly宣布他们在页面的顶部:

$table5 = 'areas'; 
$dblist = 'live_customers'; 

等。

解决方案

感谢任何人的答案和让我知道“GROUP_CONCAT”。

这里是我的解决方案:

SELECT live.*, 
live.id AS lid, 
table1.id, table1.value AS tn_val, 
table2.id, table2.value AS tp_val, 
table3.id, table3.value AS ht_val, 
table5.id, GROUP_CONCAT(table5.value) AS ar_val 
FROM $dblist AS live 
LEFT JOIN $table1 AS table1 ON live.town = table1.id 
LEFT JOIN $table2 AS table2 ON live.htype = table2.id 
LEFT JOIN $table3 AS table3 ON live.ht = table3.id 
LEFT JOIN $table5 AS table5 ON FIND_IN_SET(table5.id, REPLACE(live.areas, '-', ',')) 
GROUP BY live.id 

结果是我所期待的^^

+0

最有可能使用'GROUP_CONCAT()'。请发布其余的查询,我们可以帮助您加入。 – 2013-03-11 14:11:32

+0

感谢您的回答,只是对其进行了编辑。 – Imero 2013-03-11 14:17:47

+0

我没有看到有类似'areas'的任何列。你想列出哪一列?这将有助于查看实际的表和列,而不是PHP变量。 – 2013-03-11 14:25:07

回答

0

与GROUP_CONCAT()把它一起

0

首先要说的是,你的模式违反第一范式(1NF),因为列区域不是原子的。你不应该在一列中加入3个不同的值。

接下来你说你有一个叫做live_customers的表,有一个叫做areas的行。这是无稽之谈。行没有名字,列有。你用2列id和区域显示一些表格。这是什么桌子?

接下来在查询中没有提到名为live_customers的表。

接下来,如果表中有一个名为带有别名live的表中的区域,那么输出应包含该列,因为您选择了live。*。既然如此,你的结果就不会是你给我们展示的结果,因为它会包含一个结果列,其数据类似于10-20-30

最后那些不能是发布查询的结果,因为我可以看到结果列指定盖子。

如果您需要一些时间来确保您的问题有意义,那么您可能会得到一个合理的答案。