MySQL - вернуть одну строку из 2 строк в одной таблице, перезаписать содержимое первого «по умолчанию» заполненными полями второго «переопределения» - PullRequest
1 голос
/ 20 сентября 2011

Я пытаюсь использовать данные поиска мобильного устройства в базе данных WUFL на http://wurfl.sourceforge.net/smart.php, но у меня возникают проблемы с получением необходимого кода MySQL (я использую Coldfusion для серверной части сервера). Честно говоря, это действительно делает мою голову, но я уверен, что есть прямой подход к этому.

WUFL поставляется в виде XML (около 15200 записей на сегодняшний день), у меня есть метод, который уже сохраняет данные в базе данных MySQL. Теперь мне нужно вернуть данные полезным способом!

В основном это работает так: сначала запустите выбор, используя данные userAgent из запроса CGI, чтобы сопоставить его с известным мобильным устройством (строка 1), используя LIKE; если найдено, используйте результирующее поле fallback , чтобы найти данные по умолчанию для «семейного корня» мобильного устройства (строка 2). Две строки необходимо объединить, переписав содержимое (строка 2) с определенными функциями мобильного устройства (строка 1). Обе строки содержат пустые записи, и не все функции присутствуют в (строка 1).

Мне просто нужно вернуть заполненную строку данных, если найдено совпадение. Я надеюсь, что это имеет смысл, я хотел бы предоставить то, на что, как я думаю, должен выглядеть SQL, но я, вероятно, запутаю вещи еще больше.

Очень ценю любую помощь!

1 Ответ

1 голос
/ 21 сентября 2011

Это будет мой выстрел в 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 (оно равно нулю), тогда получите значение Feature1 из строки 2».

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...