2014-10-20 4 views
0

Я пытаюсь реализовать функцию поиска, которая не только выполняет поиск в одной таблице (задачах), но и в другой связанной таблице (действиях). Действия имеют задачу имени столбца, которая идентифицирует задачу, к которой она принадлежит (которая является ключевым столбцом столбца в таблице задач). Как я искать таблицу задач является:Слияние результатов двух запросов sql в PHP

SELECT 
    tasks.* 
FROM 
    tasks 
WHERE 
    (
     (
      tasks.description LIKE '%$search%' 
      OR tasks. NAME LIKE '$search%' 
     ) 
     AND tasks. USER = '$userid' 
    ); 

путь Я ищу таблицу деятельности является:

SELECT DISTINCT 
    tasks.* 
FROM 
    activities, 
    tasks 
WHERE 
    tasks. USER = '1' 
AND activities.description LIKE '%$search%'; 

Индивидуальные запросы работают, и они возвращают данные таблицы задач. То, что я хочу сделать, это объединить оба результата (в php), так что я получаю все записи табличных задач без повторения.

Как я могу это сделать?

+0

Почему бы не выполнить два запроса и слияние с помощью 'array_merge()' впоследствии? (Разумеется, помимо проблем с производительностью.) –

+0

Как вам их нужно комбинировать? Если результаты действий и задач не имеют ничего общего друг с другом, вы можете использовать array_merge. В противном случае вам нужно зациклировать возвращаемый массив и сопоставить их (но тогда вы можете захотеть рассмотреть вопрос о присоединении к SQL). – SheperdOfFire

+0

Так было со мной. Я предпочитаю интеллектуальное решение SQL-запросов. – aarelovich

ответ

0

Либо выполнить два запроса и объединить результаты, используя вариант array_merge() впоследствии (заботясь о возможных дубликатов), или просто подключить пункт WHERE в ваших двух SELECT заявления с OR оператора:

SELECT 
    DISTINCT tasks.* 
FROM 
    activities, 
    tasks 
WHERE 
    (
     (
      tasks.description LIKE '%$search%' 
      OR tasks.NAME LIKE '$search%' 
     ) 
     AND tasks.USER = '$userid' 
    ) 
    OR 
    (
     tasks.USER = '$userid' 
     AND activities.description LIKE '%$search%' 
    ); 

Применение некоторых булевы оптимизации:

SELECT 
    DISTINCT tasks.* 
FROM 
    activities, 
    tasks 
WHERE 
    tasks.USER = '$userid' 
    AND 
    (
     tasks.description LIKE '%$search%' 
     OR tasks.NAME LIKE '$search%' 
     OR activities.description LIKE '%$search%' 
    ); 

Во всяком случае, видя свой код, который я, конечно, надеюсь, что вы защитите себя от SQL injection по carefully sanitizing your data, или используйте PDOStatement::bindParam, который позаботится об этом для вас.

+0

Второй вариант Работал !. Не могу поверить, что я этого не видел. Спасибо!!. Не могли бы вы также рассказать, как можно было бы ввести код sql в это? Я не понимаю. Я бы полностью нарушил синтаксис. И, нет, я не использую эту команду, но я новичок в этом. – aarelovich

+0

Посмотрите, что произойдет, если вы введете в '$ search' переменную, которая содержит' '' или ''); SHOW TABLES; -'. Это делает важным дезинформирование пользовательского ввода. Правильное использование библиотеки, такой как PDO, полностью смягчает эту проблему безопасности. –

+0

Спасибо за ответ. Но я до сих пор не понимаю инъекцию qu sql. Я написал «hola in one (тест первого варианта) и скопировал и вставил ваше второе предложение. Я получил ошибку ERROR в синтаксическом синтаксисе SQL (у меня есть закрывающая метка для отображения ошибок). Итак, как я и ожидал, синтаксис сломался. – aarelovich

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