0

ハイフンで区切られたいくつかの値を持つ行があります:

テーブル: 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
...

テーブル「areas」(まったく別のテーブルです):

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

思った通りの結果です^^

4

2 に答える 2

0

GROUP_CONCAT()と一緒にそれを取る

于 2013-03-11T14:13:11.557 に答える
0

最初に言うことは、列領域がアトミックではないという点で、スキーマが第 1 正規形 (1NF) に違反していることです。1 つの列に 3 つの異なる値を入力しないでください。

次に、area という行を持つ live_customers というテーブルがあるとします。これはナンセンスです。行には名前がありませんが、列には名前があります。id と area の 2 つの列を持つテーブルを少し表示します。これは何のテーブルですか?

次のクエリでは、live_customers というテーブルについて言及されていません。

次に、ライブのエイリアスを持つエリアと呼ばれる列がテーブルにある場合、live.* を選択しているため、出力にはその列が含まれているはずです。その場合、10-20-30 のようなデータを含む結果列が含まれるため、結果は表示されたものとは異なります。

最後に、指定された蓋の結果列が表示されるため、投稿されたクエリの結果ではありません。

投稿する質問が理にかなっていることを確認するのに少し時間をかけたいと思うなら、合理的な答えが得られるかもしれません.

于 2013-03-11T17:35:07.677 に答える