2016-02-28 4 views
-1

здесь У меня есть небольшая проблема с сортировкой публикаций членов.Сортировка по двум запросам

Так у меня есть два запроса, и я хотел бы сделать функцию сортировки с ORDER BY я попытался сделать ORDER BY (p.publication, pmembre.publication) ASC

Но это не сработало.

Это моя функция:

function recup_publi_ami_membre() 
{ 
    global $bdd; 
    $query = $bdd->prepare(" 
    ( SELECT m.id_login, m.prenom, m.nom, m.affiche, m.id_admin, pmembre.publication 
     FROM amis AS a 
     INNER JOIN membre AS m 
      ON IF(a.id_dest = :id, a.id_exp, a.id_dest) = m.id_login 
     INNER JOIN publication_membre AS pmembre 
      ON m.id_login = pmembre.id_auteur 
     WHERE (a.id_exp = :id OR a.id_dest = :id) 
      AND a.active = 1 
    ) UNION (
     SELECT m.id_login, m.prenom, m.nom, m.affiche, m.id_admin, p.publication 
     FROM membre AS m 
     INNER JOIN publication AS p 
      ON m.id_login = p.id_auteur 
     WHERE m.id_login = :idget 
    ) 
    "); 
    $query->execute(array('id' => $_GET['id'], 'idget' => $_GET['id'])); 
    return $query->fetchAll(); 
} 
+1

Плюс более конкретный вопрос о том, что именно вы пробовали и какое сообщение об ошибке вы получили или неожиданное поведение, с которым вы столкнулись! – Shadow

+0

У меня нет сообщений об ошибках, сообщения исчезают Когда я пытаюсь сделать заказ по родам. – Serg77

+1

UNION будет просто создавать одно поле публикации, так что вы можете просто сделать ЗАКАЗАТЬ публикацией ASC? –

ответ

0

Чтобы уточнить jkns.co's comment:

Думай вашего запроса, как

(
    SELECT 
     m.id_login as field1, 
     m.prenom as field2, 
     m.nom as field3, 
     m.affiche as field4, 
     m.id_admin as field5, 
     pmembre.publication as field6 
    FROM ... 
) 
UNION 
(
    SELECT 
     m.id_login as field1, 
     m.prenom as field2, 
     m.nom as field3, 
     m.affiche as field4, 
     m.id_admin as field5, 
     p.publication as field6 
    FROM ... 
) 

Союз создает единый набор результатов для двух запросов и тому набор результатов состоит из записей (всех), имеющих поля1, ..., field6. И вы можете работать с этим набором результатов почти так же, как на таблице (производная таблица, и вы можете «спросить» об EXPLAIN о последствиях производительности, если вы слишком сильно нажмете на это). Итак, вы могут, например. сделать что-то вроде

SELECT field1,field2,field3,field4,field5,field6 
FROM 
    (
     SELECT 
      m.id_login as field1, 
      m.prenom as field2, 
      m.nom as field3, 
      m.affiche as field4, 
      m.id_admin as field5, 
      pmembre.publication as field6 
     FROM ... 
    ) 
    UNION 
    (
     SELECT 
      m.id_login as field1, 
      m.prenom as field2, 
      m.nom as field3, 
      m.affiche as field4, 
      m.id_admin as field5, 
      p.publication as field6 
     FROM ... 
    ) 
ORDER BY field6 ASC 

но
а) вы не должны обернуть союз в другом SELECT ... FROM <derived table>, то «ярлык» (SELECT ...) UNION (SELECT ...) ORDER BY foo будет делать.

b) вам не нужно явно указывать псевдонимы в соответствии с именами полей; MySQL будет просто использовать имена первого UNION.

Так,

(SELECT m.id_login, m.prenom, m.nom, m.affiche, m.id_admin, pmembre.publication 
    FROM amis AS a 
    ... 
) UNION (
    SELECT m.id_login, m.prenom, m.nom, m.affiche, m.id_admin, p.publication 
    FROM membre AS m 
    ... 
) 
ORDER BY publication ASC 

должен сделать трюк.

Редактировать: Подождите ... эти названия полей do матч. Вы уверены, что это должны быть две отдельные таблицы, а не одна таблица с полем флага?

edit2: о получении какого-либо сообщения об ошибке: поскольку ваш код не включает обработку ошибок «на месте», вы можете использовать switch your pdo instance to PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, например. при создании экземпляра:

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false, 
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false, 
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION 
)); 
Смежные вопросы