4

どのように対処すればよいか分からない複雑な問題があります。

特定の基準に一致する同じテーブルから値のサブセットを 2 つ定義しています。

ステートメント 1:

SELECT value FROM Values WHERE category = a

ステートメント 2:

SELECT value FROM Values WHERE category = b

ただし、ステートメント 1 の値とステートメント 2 の値を連結すると、指定された最大文字列長以下の長さの文字列が生成されるという追加の制約もあります。

これを行うには、どのようなクエリを作成できますか? よろしくお願いします。

ロテール

編集:

私のデータは次のようになります。

+---+---------+------------+----------+  
|id | routeId |category    | value    |  
+---+---------+------------+----------+  
| 1 | 1       |origin      | Paris    |  
| 2 | 1       |destination | New York |  
| 3 | 2       |origin      | Paris    |  
| 4 | 2       |destination | Berlin   |  
+------+--------------+---------------+  

そして、origin.destination が n 文字未満のルートの routeId のリストを受け取りたいと思います。

この問題をより注意深く見てみると、最初の select ステートメントの値と 2 番目の select ステートメントの値を連結したものは、特定の文字制限未満の長さでなければならないと書いたので、最初のアプローチが間違っていたことがわかりました。実際、問題はより複雑です。元の値と宛先の値の routeId は、連結が最大長未満である必要がある値のペアと同じでなければならないからです。

4

2 に答える 2

3

試す:

SELECT a.routeID
FROM   tbl a
JOIN   tbl b ON a.routeID = b.routeID AND b.category = 'destination'
WHERE  a.category = 'origin' AND
       CHAR_LENGTH(CONCAT(a.value, b.value)) <= 5

はテーブルtblの名前で、5は 2 つのステートメントを連結した最大長です。これは、各 の元の値の連結routeIDをその宛先の値と比較します。5 文字より長い場合routeIDは、除外されます。


または、これはあなたが望むものかもしれません:

テーブル内originの各値とすべての値routeIDの連結を比較します。destination

SELECT     a.routeID
FROM       tbl a
CROSS JOIN (SELECT value FROM tbl WHERE category='destination') b
WHERE      a.category = 'origin'
GROUP BY   a.routeID
HAVING     MAX(CHAR_LENGTH(CONCAT(a.value, b.value))) <= 5
于 2012-07-30T02:39:16.927 に答える
0

次のクエリを試すことができます。

SELECT t1.value AS v1, t2.value AS v2, LEFT(CONCAT(t1.value, t2.value), 20) AS my_text
FROM `values` t1, `values` t2
WHERE t1.category=a AND t2.category=b

最大長は 20 文字ですが、必要に応じて変更してください。

VALUES はMySQL の予約語であるため、構文エラーを避けるためにバッククォートで囲む必要があります。

あなたのコメントを読んだ後の他のクエリ:

SELECT t1.value AS v1, t2.value AS v2, CONCAT(t1.value, t2.value) AS my_text
FROM `values` t1, `values` t2
WHERE t1.category=a AND t2.category=b
AND CHAR_LENGTH(CONCAT(t1.value, t2.value))<=20

このクエリは、両方の値の連結が 20 文字以下のレコードを返します。

ドキュメント: LENGTHCHAR_LENGTH

于 2012-07-30T02:31:08.740 に答える