Автозаполнение пользовательского интерфейса Jquery из нескольких источников данных с использованием запроса UNION

Следующий запрос работает правильно, чтобы вытащить названия компаний из одной таблицы в автозаполнение пользовательского интерфейса jquery:

SELECT name FROM company WHERE name LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%"

Результат зацикливается в массиве и кодируется в JSON, затем возвращается в jquery и правильно отображает предложения автозаполнения.

Я пытаюсь изменить его для извлечения из двух или более таблиц:

SELECT name
FROM (
SELECT name
FROM company
UNION ALL SELECT CONCAT( fname,  ' ', lname ) 
FROM contact
) AS name
WHERE name LIKE  "'. mysql_real_escape_string($_REQUEST['term']) .'%"

Целью в этом случае будет включение в список автозаполнения названий компаний и имен контактов. Когда я запускаю запрос независимо от моего приложения (просто используя консоль PhpMyAdmin) с образцом условия поиска, он успешно отображает желаемые результаты. Однако в контексте моей формы автозаполнения пользовательского интерфейса jquery она не возвращает никаких предложений автозаполнения.

Буду признателен за любые предложения. Спасибо!

EDIT: примеры результатов SQL

Вот результат, который я получаю, когда запускаю каждый из этих запросов в PhpMyAdmin с тестовым запросом «mi».

Мой исходный запрос с одной таблицей:

Generation Time: Jul 20, 2011 at 01:40 AM
Generated by: phpMyAdmin 3.3.9 / MySQL 5.5.8
SQL query: SELECT name FROM company WHERE name LIKE "mi%" LIMIT 0, 30 ; 
Rows: 6

name
[rows removed]

Г-н. Предложенная Вандой модификация:

Generation Time: Jul 20, 2011 at 01:50 AM
Generated by: phpMyAdmin 3.3.9 / MySQL 5.5.8
SQL query: SELECT temptable.name FROM ( SELECT name as name FROM company UNION ALL SELECT CONCAT( fname, ' ', lname ) as name FROM contact ) AS temptable WHERE temptable.name LIKE "mi%" ; 
Rows: 15

name
[rows removed]

Оба являются допустимыми SQL, которые приводят к таблице из одного столбца со строками, содержащими имена, но только первый работает в пользовательском интерфейсе jquery. знак равно


person Joe M.    schedule 19.07.2011    source источник
comment
Я как бы следую, хотя я не знаю, как работает ваша форма автозаполнения пользовательского интерфейса или что она ожидает. Сколько столбцов вы получите в результирующем наборе при объединении таблиц? Сколько столбцов ожидает ваш пользовательский интерфейс?   -  person MacGyver    schedule 20.07.2011
comment
Ах, извините, просто пытался сделать это простым. Оба приведенных выше запроса приводят к одному столбцу с именем name. jquery ожидает массив с меткой и значением, которым я присваиваю массив имен. Не уверен, что это лучшая практика, но я получил ее из примера, который нашел в Интернете, и он отлично работал для более простого запроса. Вот соответствующий php:   -  person Joe M.    schedule 20.07.2011
comment
while( $row = mysql_fetch_array([ЗАПРОС SQL], MYSQL_ASSOC)) { $data[] = array( 'label' => $row['name'], 'value' => $row['name'] ) ; }   -  person Joe M.    schedule 20.07.2011
comment
@jmiller: вы получаете какие-либо ошибки javascript? Вы открывали firebug, чтобы увидеть различия в данных, извлекаемых через AJAX?   -  person Andrew Whitaker    schedule 20.07.2011
comment
Эндрю - никаких ошибок javascript ни с одним запросом. Первый (более простой) запрос работает, второй просто не выдает никаких предложений автозаполнения, хотя и не показывает никаких ошибок. Источник автозаполнения в коде jquery - это еще один php-файл с кодом для выполнения SQL-запроса, а затем возврата закодированного массива JSON.. поэтому я не думаю, что в процессе производства он может отображать ошибку. Я попробую предложение firebug завтра. Спасибо!   -  person Joe M.    schedule 20.07.2011


Ответы (1)


См. полужирный текст ниже.

ВЫБЕРИТЕ temptable.[name]
FROM (

ВЫБЕРИТЕ имя как [имя]
ОТ компании

СОЮЗ ВСЕХ

SELECT TRIM(ISNULL(fname,'') + ' ' + ISNULL(lname,'')) as [name]
FROM contact

) AS temptable
WHERE
temptable.name LIKE "'.mysql_real_escape_string($_REQUEST['term']) .'%"

person MacGyver    schedule 19.07.2011
comment
Спасибо за вашу помощь ... попробовал это изменение, но все равно не повезло. Я опубликовал результаты выполнения этих SQL-запросов независимо от jquery выше в своем исходном сообщении. - person Joe M.; 20.07.2011
comment
почему в первом есть предложение LIMIT? Кроме того, если вы запускаете контактный запрос независимо, сколько строк вы получите в результирующем наборе? - person MacGyver; 20.07.2011
comment
Ой, PhpMyAdmin добавил LIMIT автоматически.. он не идет в моем приложении, но результаты все равно те же.. контактный запрос независимо приводит к 9 строкам, хотя почему-то он говорит, что показаны строки 0 - 8 (всего 9 ) - person Joe M.; 20.07.2011
comment
и контактный запрос (работающий независимо) отлично отображается в пользовательском интерфейсе jquery? - person MacGyver; 20.07.2011
comment
Ах.. нет! Это не так... интересно, я попробовал только имя fname AS без CONCAT, и оно сработало (все еще независимо от первого запроса)... Интересно, вызывает ли CONCAT проблему с jquery... - person Joe M.; 20.07.2011
comment
интересно, есть ли у вас нулевое имя f или нулевое имя l. Есть ли функция ISNULL в MYSQL? Я использую SQL Server только на работе. Попробуйте RTRIM(LTRIM(ISNULL(fname, '') + ' ' + ISNULL(lname,''))) .. вам нужно будет найти эквивалент в mysql - person MacGyver; 20.07.2011
comment
Только что взглянул на таблицу, это всего пара сотен строк, но есть несколько нулевых значений (некоторые данные были импортированы из предыдущего источника до того, как мы прошли проверку). Может ли это быть причиной проблемы? Интересно, что необработанный запрос выводится нормально (даже с CONCAT), проблема только с jquery. Завтра я посмотрю, смогу ли я очистить данные и попробую. Еще раз спасибо за помощь! - person Joe M.; 20.07.2011
comment
Получил эту ошибку с измененным кодом: # 1582 - Неверный счетчик параметров в вызове нативной функции «ISNULL»... Я немного поиграю с этим, чтобы посмотреть, как я могу перевести его в MySQL. - person Joe M.; 20.07.2011
comment
Я недостаточно знаю MySQL. Я рекомендую сделать это очень простым и посмотреть онлайн-документацию MySQL ISNULL. Попробуйте выполнить очень простой запрос, используя эту функцию. Все, что он делает, это возвращает значение второго аргумента (которое равно ''), если первый аргумент (имя) равен нулю. - person MacGyver; 20.07.2011
comment
Что ж, при поиске документации ISNULL я нашел объединение и заменил вашу строку ISNULL следующим: SELECT COALESCE(CONCAT(fname, , lname), fname, lname) as name. Который теперь возвращает конкатенированную строку fname и lname, ИЛИ, если одно из этих значений равно null, то только fname или только lname. Еще раз спасибо за помощь! - person Joe M.; 20.07.2011