MySQL - 从同一表中的 2 行返回一行,用第二个 'default' 的填充字段覆盖第一个 'override' 的内容

标签 mysql coldfusion

我正在尝试使用位于 http://wurfl.sourceforge.net/smart.php 的 WUFL 数据库中的移动设备查找数据但是我在理解所需的 MySQL 代码时遇到了问题(我使用 Coldfusion 作为服务器后端)。老实说,这确实让我费尽心思,但我确信有一种直接的方法可以解决这个问题。

WUFL 以 XML 形式提供(迄今为止大约有 15200 条记录),我已经编写了将数据保存到 MySQL 数据库的方法。现在我需要以一种有用的方式取回数据!

基本上它是这样工作的:首先使用来自 CGI 拉取的 userAgent 数据运行选择,以使用 LIKE 匹配已知的移动设备(第 1 行);如果找到,则使用生成的 fallback 字段来查找移动设备“家庭根”(第 2 行)的默认数据。这两行需要通过用(第 1 行)的特定移动设备的功能覆盖(第 2 行)的内容来组合。这两行都包含 NULL 条目,并且并非所有功能都存在于(第 1 行)中。

如果找到匹配项,我只需要返回完全填充的数据行。我希望这是有道理的,我会提供我认为 SQL 应该是什么样的,但我可能会更加混淆。

非常感谢任何帮助!

最佳答案

这将是我在 SQL Server 中的尝试。您需要使用 IFNULL而不是 ISNULL:

SELECT
    ISNULL(row1.Feature1, row2.Feature1) AS Feature 1
    , ISNULL(row1.Feature2, row2.Feature2) AS Feature 2
    , ISNULL(row1.Feature3, row2.Feature3) AS Feature 3
FROM
    featureTable row1
    LEFT OUTER JOIN featureTable row2 ON row1.fallback = row2.familyroot
WHERE row1.userAgent LIKE '%Some User Agent String%'

这应该在 MySQL 中完成同样的事情:

SELECT
    IFNULL(row1.Feature1, row2.Feature1) AS Feature 1
    , IFNULL(row1.Feature2, row2.Feature2) AS Feature 2
    , IFNULL(row1.Feature3, row2.Feature3) AS Feature 3
FROM
    featureTable AS row1
    LEFT OUTER JOIN featureTable AS row2 ON row1.fallback = row2.familyroot
WHERE row1.userAgent LIKE '%Some User Agent String%'

所以它的作用是获取您的特征表,将其别名为 row1 以获取您的特定模型特征。然后我们将它作为 row2 连接回自身以获得家庭特征。然后 ISNULL 函数表示“如果第 1 行中没有 Feature1 值(它为空),则从第 2 行获取 Feature1 值”。

希望对您有所帮助。

关于MySQL - 从同一表中的 2 行返回一行,用第二个 'default' 的填充字段覆盖第一个 'override' 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7482231/

相关文章:

c# - 将纯文本从文本框转换为 SHA1,然后将 Sha1 转换为基数 64 C#

MySQL - 创建比一个开始更多的结果(例如 : integers within an interval)

html - Coldfusion 80 标签模板

sql-server-2008 - 执行数据库查询时出错(WHERE 子句有问题?)

php - 如果至少其中一行具有给定值,则选择具有给定 ID 的所有行

php - html选择不工作

MySQL 正则表达式搜索

coldfusion - 直接访问 application.cfc 会产生未捕获的 ColdFusion 错误

sql-server - 插入 JSON 数据时数据被截断

coldfusion - 在 ColdFusion 服务器之间共享登录凭据?