2013-10-08 2 views
3

Я искал решение этой проблемы, некоторые из них близки, но не могут найти решение. У меня есть таблица «прогонов» с различной информацией, один столбец - информация о компании, к которой она относится. У меня также есть таблица компаний, которые хранят всю информацию о компании. В столбце компании таблицы прогонов компания идентифицируется «индексатором» из таблицы компаний.mysql подзапрос с несколькими ошибками результатов

Теперь у меня есть поиск, где вы можете найти любую информацию о прогоне, чтобы найти любое количество записей, содержащих поисковую фразу, включая компанию. Как столбец компании таблицы запуска имеет только номер идентификатора, т.е. 34, 23, 5 и т. Д. Мне нужно также проверить совпадения в столбце имен таблицы компании.

Это мой запрос, который отлично работает, если только одна компания соответствует результатам поиска. Мне нужно вернуть все совпадения этой компании.

$sql_results = "SELECT * FROM runs WHERE name LIKE '%$searchname%' OR company = (SELECT indexer FROM companies WHERE name LIKE '%$searchname%') OR feild LIKE '%$searchname%' ORDER BY date_due";

while($result_results = @mysql_fetch_array($query_results)) 
    { 
    $resultnm_array[]=$result_results['name']; 
    $cmp_id = $result_results['company']; 
     $sql2 = "SELECT name FROM companies WHERE indexer = '$cmp_id' LIMIT 1"; 
     $query2 = @mysql_query($sql2); 
     $result2 = @mysql_fetch_array($query2); 
     $resultcpy_array[]=$result2['name']; 
    $resultfld_array[]=$result_results['feild']; 
    $resultdt_array[]=$result_results['date_due']; 
    $resultid_array[]=$result_results['indexer']; 
    } 

Я ввод результатов в массив и используя механизм шаблонов TBS для создания таблицы результатов и т.д. Я немного новичка, так что любая помощь будет оценен. Из того, что я собираюсь, мне нужно использовать соединение. Но я не могу показаться, чтобы заставить его работать ...

+0

Вы должны прочитать о нормализации таблиц, но принять смотреть Функция MySQL FIND_IN_SET –

ответ

4

Вы можете не только использовать IN:

SELECT * 
FROM runs 
WHERE name LIKE '%$searchname%' 
    OR company IN (
     SELECT indexer 
     FROM companies 
     WHERE name LIKE '%$searchname%') 
    OR feild LIKE '%$searchname%' 
ORDER BY date_due 

Учитывая Ваши комментарии: «отлично работает, если только одна компания соответствует результаты поиска» - что приводит меня полагать, что если несколько компаний соответствуют критериям поиска, запрос терпит неудачу из-за =.


Учитывая внесенные изменения, вы могли бы сделать это проще с помощью JOIN и вы никогда больше не требует дополнительного оператора выбора в цикле:

SELECT r.*, c.name 
FROM runs r 
    JOIN companies c on r.company = c.indexer 
WHERE r.name LIKE '%$searchname%' 
    OR r.feild LIKE '%$searchname%' 
ORDER BY r.date_due 
+0

Есть ли преимущество использования JOIN other, а затем дополнительного оператора SELECT? Для меня первый способ легче читать и, следовательно, устранять неполадки. – Tyler

+0

@ Тайлер - да, определенно. Для вашей текущей реализации требуется несколько обращений к базе данных. Сначала верните результаты. Затем для каждого результата снова удалите базу данных, чтобы получить название своей компании. Используя 'Join', вы можете достичь этого в одном вызове db. Попробуй - удачи! – user2480596

Смежные вопросы