2013-03-01 2 views
1

Я нашел справки по этой теме: Search different column names in different tables in MySQL, но они ссылаются только на два поля в таблице в этой теме, и я не смог создать ответ из моих поисков.поиск двух разных таблиц MySQL с разными полями

EDIT: Я также нашел эту тему: Combine two tables that have no common fields, которая дает немного более полезную информацию, но я до сих пор не в состоянии понять, как совместить эти правильно

Я никогда не имел необходимость создания a JOIN или UNION, так что это все для меня совсем ново. Так что простите меня, если есть легкое решение этого.

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

Вот два запроса я пытаюсь объединить в одну:

"SELECT * FROM seekers 
    WHERE (first_name LIKE '%".$q."%') 
     OR (last_name LIKE '%".$q."%') 
     OR (username LIKE '%".$q."%') 
     OR (school LIKE '%".$q."%') 
     OR (major LIKE '%".$q."%') 
     OR (employer LIKE '%".$q."%') 
     OR (position LIKE '%".$q."%') 
     OR (background LIKE '%".$q."%') 
     OR (interests LIKE '%".$q."%') 
     OR (skills LIKE '%".$q."%') 
    ORDER BY id DESC" 

"SELECT * FROM companies 
    WHERE (company_name LIKE '%".$q."%') 
     OR (username LIKE '%".$q."%') 
     OR (industry LIKE '%".$q."%') 
     OR (slogan LIKE '%".$q."%') 
     OR (location LIKE '%".$q."%') 
    ORDER BY id" 

После запроса, я хочу, чтобы все поля в массив и отображать данные соответственно.

Я предполагаю, что основная проблема, с которой я столкнулась, - это решить, как мне следует сочетать таблицы? Я хочу использовать JOIN (внутренний или внешний) или я хочу использовать UNION?

Я попытался создать VIEW, выполнив это: $this->mysqli->query("CREATE VIEW userTable AS (SELECT * FROM seekers) UNION ALL (SELECT * FROM companies)");, но это не сработало, я предполагаю, потому что в таблицах есть разные поля.

EDIT: После попытки некоторых из приведенных ниже ответов, я пришел с этим запросом:

SELECT first_name, last_name, username, school, major, employer, position, background, interests, skills 
    FROM seekers 
     WHERE (first_name LIKE '%".$q."%') 
     OR (last_name LIKE '%".$q."%') 
     OR (username LIKE '%".$q."%') 
     OR (school LIKE '%".$q."%') 
     OR (major LIKE '%".$q."%') 
     OR (employer LIKE '%".$q."%') 
     OR (position LIKE '%".$q."%') 
     OR (background LIKE '%".$q."%') 
     OR (interests LIKE '%".$q."%') 
     OR (skills LIKE '%".$q."%') 
    UNION ALL 
     SELECT company_name, username, industry, slogan, location, NULL, NULL, NULL, NULL, NULL 
      WHERE (company_name LIKE '%".$q."%') 
       OR (username LIKE '%".$q."%') 
       OR (industry LIKE '%".$q."%') 
       OR (slogan LIKE '%".$q."%') 
       OR (location LIKE '%".$q."%') 

я удалил статью ORDER BY, потому что я получаю сообщение об ошибке говорящее «Неправильное использование UNION и ORDER BY ", поэтому после удаления ORDER BY я получаю эту ошибку:« Ошибка запроса: у вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «WHERE (имя_компании LIKE»% 0% ') ИЛИ (имя пользователя LIKE'% 0% ') ИЛИ (промышленность LIKE'% 0% ')' по строке 1 "

Почему $q становится 0 в запросе после объединения?

EDIT # 2: Вот запрос JOIN, который я собрал, который фактически возвращает данные, но не возвращает правильные данные. Я не знаю, поможет ли это ответить на этот вопрос, но я подумал, что все равно буду здесь.

"SELECT * FROM seekers t1 LEFT JOIN companies t2 ON t1.id = t2.id WHERE (t1.first_name LIKE '%".$q."%') OR (t1.last_name LIKE '%".$q."%') OR (t1.username LIKE '%".$q."%') OR (t1.school LIKE '%".$q."%') OR (t1.major LIKE '%".$q."%') OR (t1.employer LIKE '%".$q."%') OR (t1.position LIKE '%".$q."%') OR (t1.background LIKE '%".$q."%') OR (t1.interests LIKE '%".$q."%') OR (t1.skills LIKE '%".$q."%') OR (t2.company_name LIKE '%".$q."%') OR (t2.username LIKE '%".$q."%') OR (t2.industry LIKE '%".$q."%') OR (t2.slogan LIKE '%".$q."%') OR (t2.location LIKE '%".$q."%')" 

извините за форматирование по последнему запросу, SO испортил его при вставке.

+0

может быть, это поможет: http://stackoverflow.com/questions/7407864/mysql-select-union- for-different-columns –

ответ

1

Когда вы используете UNION, вам нужно убедиться, что количество полей в каждом SELECT равно. Так что в вашем примере выше вы не должны использовать 'Select *' - сделать что-то вроде этого:

Выбрать t1.field1, t1.field2, t1.field3, t1.field4, t1.field5, t1.field6
От .....
Где .....

Союз

Выберите t2.field1, t2.field2, t2.field3, t2.field4, '', ''
От .....
Где .....

Если количество полей в каждом выборе отличается друг от друга, добавьте несколько пустых в него.

+0

Я попробую. Это самый простой способ сделать что-то подобное? –

+0

Я открыт для исправления, но это, наверное, самый прямой путь! – kbbucks

+0

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

2

Вы можете попробовать UNION, но укажите имя каждого столбца как псевдоним. Убедитесь, что они в одном порядке. См. Ниже в качестве примера:

SELECT first_name col1, last_name col2 etc etc FROM seekers 
    WHERE (first_name LIKE '%".$q."%') 
     OR (last_name LIKE '%".$q."%') 
     OR (username LIKE '%".$q."%') 
     OR (school LIKE '%".$q."%') 
     OR (major LIKE '%".$q."%') 
     OR (employer LIKE '%".$q."%') 
     OR (position LIKE '%".$q."%') 
     OR (background LIKE '%".$q."%') 
     OR (interests LIKE '%".$q."%') 
     OR (skills LIKE '%".$q."%') 
    ORDER BY id DESC 
UNION 
SELECT company_name col1, username col2, etc etc FROM companies 
    WHERE (company_name LIKE '%".$q."%') 
     OR (username LIKE '%".$q."%') 
     OR (industry LIKE '%".$q."%') 
     OR (slogan LIKE '%".$q."%') 
     OR (location LIKE '%".$q."%') 
    ORDER BY id 

Это будет соответствовать столбцам вместе в том же результирующем наборе. т.е. first_name и company_name будут показаны в col1 и т. д.

ПРИМЕЧАНИЕ

  1. С UNION вам необходимо выбрать одинаковое количество столбцов в обоих запросах.
  2. Вы должны соответствовать типам данных
  3. Если вам нужно поддельной применение колонки нулевой
+0

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

+0

Добавьте псевдоним для каждого столбца и посмотрите, есть ли у вас такая же ошибка. Псевдоним должен быть одинаковым в обоих запросах. 'first_name col1' и' company_name col1', 'last_name col2' и' username col2' и т. д. и т. д. –

+0

Я попытался добавить псевдонимы, и это не сработало. Я создал запрос 'JOIN', который возвращает данные, но это не правильные данные. Я обновил свой вопрос с помощью этого запроса. –

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