MySQL Union неправильно возвращает имя таблицы

мне нужно искать в нескольких таблицах:

$query ="(SELECT *, 'product' AS type FROM products WHERE title LIKE ? OR description LIKE ? OR full_description LIKE ? OR keywords LIKE ? OR option1 LIKE ? OR option2 LIKE ? OR option3 LIKE ? OR option4 LIKE ? OR option5 LIKE ? OR option6 LIKE ? OR option7 LIKE ? OR option8 LIKE ?) 
UNION 
(SELECT *, 'article' AS type, NULL AS image1, NULL AS image2, NULL AS image3, NULL AS image4 FROM articles WHERE title LIKE ? OR description LIKE ? OR full_description LIKE ? OR keywords LIKE ? OR option1 LIKE ? OR option2 LIKE ? OR option3 LIKE ? OR option4 LIKE ? OR option5 LIKE ? OR option6 LIKE ? OR option7 LIKE ? OR option8 LIKE ?) 
UNION 
(SELECT *, 'news' AS type, NULL AS image1, NULL AS image2, NULL AS image3, NULL AS image4 FROM news WHERE title LIKE ? OR description LIKE ? OR full_description LIKE ? OR keywords LIKE ? OR option1 LIKE ? OR option2 LIKE ? OR option3 LIKE ? OR option4 LIKE ? OR option5 LIKE ? OR option6 LIKE ? OR option7 LIKE ? OR option8 LIKE ?) 
UNION 
(SELECT *, 'page' AS type, NULL AS categoryID, NULL AS categoryName, NULL AS full_description, NULL AS image, NULL AS image1, NULL AS image2, NULL AS image3, NULL AS image4, NULL AS price FROM pages WHERE title LIKE ? OR description LIKE ? OR option1 LIKE ? OR option2 LIKE ? OR option3 LIKE ? OR option4 LIKE ? OR option5 LIKE ? OR option6 LIKE ? OR option7 LIKE ? OR option8 LIKE ?) 
UNION 
(SELECT *, 'gallery_image' AS type, NULL AS categoryID, NULL AS categoryName, NULL AS full_description, NULL AS image1, NULL AS image2, NULL AS image3, NULL AS image4, NULL AS price FROM gallery_images WHERE title LIKE ? OR description LIKE ? OR option1 LIKE ? OR option2 LIKE ? OR option3 LIKE ? OR option4 LIKE ? OR option5 LIKE ? OR option6 LIKE ? OR option7 LIKE ? OR option8 LIKE ?)";
$selectFromTables = $this->db->prepare($query);
$selectFromTables->execute(array("%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%", "%" . $keyword . "%"));
$found = $selectFromTables->rowCount();
while($rowSearch = $selectFromTables->fetch(PDO::FETCH_ASSOC))
{
    $id = $rowSearch['id'];
    $type = $rowSearch['type'];
    $title = $rowSearch['title'];
    echo $id . "->" . $type . "<br />";
}

почему цикл while возвращает этот вывод?

23->product
24->product
25->product
27->product
28->product
1->
1->
2->
4->
5->

но я ожидаю этот вывод:

23->product
24->product
25->product
27->product
28->product
1->article
1->news
2->page
4->page
5->page

person Mohammad Masoudian    schedule 28.07.2013    source источник
comment
Возможный дубликат   -  person david strachan    schedule 29.07.2013
comment
нет, это не дубликат.   -  person Mohammad Masoudian    schedule 29.07.2013
comment
Прочитайте ОТВЕТ, это решит вашу проблему   -  person david strachan    schedule 29.07.2013
comment
@davidstrachan Я не вижу здесь именованного параметра.   -  person RandomSeed    schedule 29.07.2013


Ответы (1)


Весьма вероятно, что вы неправильно используете оператор UNION.

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

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

person RandomSeed    schedule 28.07.2013
comment
да, в моих таблицах не одинаковое количество столбцов, и я сделал их одинаковыми, добавив столбцы NULL - person Mohammad Masoudian; 29.07.2013
comment
Слишком поздно :) Ваш * означает все столбцы, поэтому несоответствие уже существует, когда вы добавляете свои столбцы NULL - столбцы с псевдонимом type не находятся в одной и той же позиции. Попробуйте перечислить ваши столбцы явно (в том же порядке для всех таблиц) вместо *. - person RandomSeed; 29.07.2013
comment
Если вам не нужны все столбцы на уровне приложения, в любом случае лучше не извлекать все данные из базы данных. Часто это позволяет ускорить выполнение запроса, не говоря уже о меньшем объеме данных, возвращаемых обратно клиенту. - person RandomSeed; 29.07.2013
comment
в этом случае мне нужны все :) спасибо за этот момент :) - person Mohammad Masoudian; 29.07.2013