我正在尝试使用位于 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/