4

我有一个复杂的问题,我不太确定如何解决。

我正在从同一个表中定义两个匹配某些条件的值子集。

声明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 语句中的任何值与第二个 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

wheretbl是表的名称,并且5是两个语句连接的最大长度。routeID这会将每个的原始值与其目标值的串联进行比较。如果它长于五个字符,则将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 回答