2013-06-25 3 views
-1

Je veux faire fusionner 2 tables, puis faire ORDER BY, d'abord les commander par colonne top, de sorte que les produits avec la valeur 1 dans top s'affichent d'abord dans le jeu d'enregistrements. Par la suite, je veux les commander par colonne premium, de sorte que les produits avec la valeur 1 vont juste après les produits top.Ordre par plusieurs colonnes à partir de 2 tables

Après cela, je veux le reste des produits à commander par pub_date de la table items et des produits à valeur 1 dans la colonne highlighted ne doit pas être montré directement ci-dessous top et premium articles.

Depuis tableaux originaux sont pleins d'informations inutiles, voici les versions dépouillées vers le bas:

Table `items`: 
+-------+------------+--------+ 
| pk_id | pub_date | author | 
+-------+------------+--------+ 
|  1 | 2013-06-11 | John | 
|  2 | 2013-06-12 | Mike | 
|  3 | 2013-06-25 | Seth | 
|  4 | 2013-06-11 | Drew | 
|  5 | 2013-06-13 | Joe | 
+-------+------------+--------+ 

Table `paid_items`: 
+-------+-----+---------+-------------+--------+ 
| fk_id | top | premium | highlighted | active | 
+-------+-----+---------+-------------+--------+ 
|  2 | 1 |  0 |   0 |  1 | 
|  3 | 0 |  0 |   1 |  1 | 
|  4 | 0 |  1 |   0 |  1 | 
|  5 | 0 |  0 |   1 |  1 | 
+-------+-----+---------+-------------+--------+ 

EDIT: Voici le pseudo (ou autre) de ce que je veux accomplir:

PRODUCTS_LIST> 
    PRODUCTS WITH TOP VALUE 
    PRODUCTS WITH PREMIUM VALUE 
    PRODUCTS ORDERED BY PUB_DATE> 
     PRODUCT WITH NO HIGHLIGHTED VALUE 
     PRODUCT WITH NO HIGHLIGHTED VALUE 
     PRODUCT WITH HIGHLIGHTED VALUE 
     PRODUCT WITH NO HIGHLIGHTED VALUE 
     PRODUCT WITH HIGHLIGHTED VALUE 
     ... 

Une version rayée de la façon dont le jeu d'enregistrements devrait ressembler, se concentre sur highlighted colonne:

mysql> select pk_id, highlighted from items left join paid_items on items.pk_id 
= paid_items.fk_id order by pub_date desc; 
+-------+-------------+ 
| pk_id | highlighted | 
+-------+-------------+ 
|  3 |   1 | 
|  5 |   1 | 
|  2 |   0 | 
|  1 |  NULL | 
|  4 |   0 | 
+-------+-------------+ 
+0

Donc, vous voulez fusionner les tables 'items' et' paid_items'? – KaeL

+0

Yup. C'est en fait la version réduite de 2 grandes tables, donc vous n'avez pas de mur de texte dans la question SO. Ce dont j'ai besoin, c'est de tout commander par 'top',' premium' et 'pub_date', mais ne pas prendre' highlight' en considération - c'est juste une information que j'utilise plus tard pour l'impression du produit. Il va donc retourner un ensemble d'enregistrements contenant les produits 'top' et' premium', les ordonner par ces 2 colonnes, et ensuite retourner les autres produits commandés par 'pub_date', peu importe s'il est en surbrillance ou non. – jOpacic

Répondre

0

simple sélection serait: -

SELECT * 
FROM items a 
LEFT OUTER JOIN paid_items b 
ON a.pk_id = b.fk_id 
ORDER BY b.top, b.premium, a.pub_date 

mais je suppose que vous savez déjà.

Cependant, je ne suis pas sûr de ce que vous entendez par produits avec la valeur 1 dans la colonne en surbrillance ne devrait pas être montré directement ci-dessous haut et les articles de prime. Voulez-vous ces exclus, ou affiché au bas de la liste. Pourriez-vous mettre un exemple de sortie dans votre question?

+0

Modifier la jointure gauche à une jointure interne pour exclure des enregistrements où il n'y a aucun enregistrement correspondant sur paid_items – Kickstart

+0

S'il vous plaît voir ma modification de la question – jOpacic

+0

Peur je ne peux pas voir comment cet ordre correspond à vos besoins et les données d'échantillon. Par exemple, vous dites de commander par le haut en premier lieu et le seul enregistrement avec le sommet de 1 est le record 2, pourtant cela monte 3ème dans votre liste. – Kickstart

Questions connexes