连字符分隔值和LEFT_JOIN

时间:2013-03-11 14:09:04

标签: php mysql

我有一行带有连字符分隔的值:

表: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查询中,您只看到表变量,因为我之前在页面顶部声明了它们:

$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

结果是我所期待的^^

2 个答案:

答案 0 :(得分:0)

与GROUP_CONCAT()

一起使用

答案 1 :(得分:0)

首先要说的是,您的架构违反了第一范式(1NF),因为列区域不是原子的。您不应该在一列中放置3个不同的值。

接下来,您说有一个名为live_customers的表,其中包含一个名为areas的行。这是无稽之谈。行没有名称,列没有。你会显示一些包含2列id和区域的表格。这是什么表?

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

接下来,如果表中有一个名为fields的列,其别名为live,那么输出应该包含该列,因为您选择了live。*。在这种情况下,您的结果不能是您向我们展示的结果,因为它将包含数据结果列,如10-20-30

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

如果你想花一些时间来确保你的帖子有意义,那么你可能会得到一个合理的答案。