2016-09-15 5 views
0

Ich habe den folgenden PHP-Code mit der Abfrage, um die Produkte aus Datenbank abgerufen werden:Put gewünschte Zeile id oben

$sql = "SELECT * FROM products WHERE id_category = :id_category"; 
$query = $conn->prepare($sql); 
$query->execute(array 
(
    'id_category' => $id_category 
)); 

while($row = $query->fetch(PDO::FETCH_ASSOC)) 
{ 
    extract($row); 
    echo $id_product; //1, 2, 3, 4, 5, 6, 7 etc 
} 

Was ich brauche ist die Zeile des Produkts mit der ID oben zu setzen und ich weiß einfach nicht, wie ich das machen soll. Meine Versuche mit ORDER BY sind alle fehlgeschlagen.

+0

Ich glaube nicht, dass dies möglich ist. – FluxCoder

+0

So kann die Lösung nicht mit SQL gemacht werden? Mit PHP so, aber wie? – Hypister

+0

@aynber Danke, ich habe nach einer Frage danach gesucht, aber nichts gefunden. – Hypister

Antwort

1

können Sie mit der ORDER BY Klausel mit der Reihenfolge spezifisch zurückgeführt, so vielleicht für Ihre Bedürfnisse können Sie versuchen:

select * from `products` where `id_category` = :id_category order by `id`=5 desc; 

Als Beispiel dafür, wie sich dies ändert die Reihenfolge der folgenden

mysql> select * from accounts; 
+----+-----------+----------+----------+ 
| id | sponsorID | open  | close | 
+----+-----------+----------+----------+ 
| 1 |  23 | 6:00 AM | 10:30 PM | 
| 2 |  23 | 6:00 AM | 8:30 PM | 
| 3 |  21 | 11:00 AM | 5:30 PM | 
| 4 |  23 | 7:00 AM | 2:30 PM | 
| 5 |  24 | 9:00 AM | 11:30 PM | 
| 6 |  25 | 6:00 AM | 9:30 PM | 
| 7 |  99 | 6:00 AM | 9:30 PM | 
+----+-----------+----------+----------+ 


mysql> select * from accounts order by id=5 desc; 
+----+-----------+----------+----------+ 
| id | sponsorID | open  | close | 
+----+-----------+----------+----------+ 
| 5 |  24 | 9:00 AM | 11:30 PM | 
| 1 |  23 | 6:00 AM | 10:30 PM | 
| 2 |  23 | 6:00 AM | 8:30 PM | 
| 3 |  21 | 11:00 AM | 5:30 PM | 
| 4 |  23 | 7:00 AM | 2:30 PM | 
| 6 |  25 | 6:00 AM | 9:30 PM | 
| 7 |  99 | 6:00 AM | 9:30 PM | 
+----+-----------+----------+----------+ 
betrachten

Sie können mehr als ein expliziten Begriff in der Reihenfolge angeben oder die Reihenfolge der nachfolgenden Spalten

mischen
mysql> select * from accounts order by id=5 desc, id desc; 
+----+-----------+----------+----------+ 
| id | sponsorID | open  | close | 
+----+-----------+----------+----------+ 
| 5 |  24 | 9:00 AM | 11:30 PM | 
| 7 |  99 | 6:00 AM | 9:30 PM | 
| 6 |  25 | 6:00 AM | 9:30 PM | 
| 4 |  23 | 7:00 AM | 2:30 PM | 
| 3 |  21 | 11:00 AM | 5:30 PM | 
| 2 |  23 | 6:00 AM | 8:30 PM | 
| 1 |  23 | 6:00 AM | 10:30 PM | 
+----+-----------+----------+----------+ 

oder

mysql> select * from accounts order by id=5 desc, id=1 desc, id desc; 
+----+-----------+----------+----------+ 
| id | sponsorID | open  | close | 
+----+-----------+----------+----------+ 
| 5 |  24 | 9:00 AM | 11:30 PM | 
| 1 |  23 | 6:00 AM | 10:30 PM | 
| 7 |  99 | 6:00 AM | 9:30 PM | 
| 6 |  25 | 6:00 AM | 9:30 PM | 
| 4 |  23 | 7:00 AM | 2:30 PM | 
| 3 |  21 | 11:00 AM | 5:30 PM | 
| 2 |  23 | 6:00 AM | 8:30 PM | 
+----+-----------+----------+----------+ 
1

Verwenden Sie eine UNION von 2 Abfragen, um dies zu erreichen. Lassen Sie mich neu schreiben nur die Abfrage hier:

SELECT * FROM products WHERE id_category = :id_category WHERE id=5 
UNION 
SELECT * FROM products WHERE id_category = :id_category WHERE id!=5 
0

Try this:

$sql = "SELECT *,(id_category=5) as top FROM products WHERE id_category = :id_category ORDER BY top DESC"; 
$query = $conn->prepare($sql); 
$query->execute(array 
(
    'id_category' => $id_category 
)); 
1

Ich würde ein neues Array füllen und verwenden array_unshift();

$ rowHolder enthält jetzt alle Zeilen, wobei die Zeile id = 5 am Nullindex hat.

1

Es ist trivial in MySQL:

SELECT ... 
... 
ORDER BY (id_category = 5) DESC, id_category 

Dies funktioniert, indem das Ergebnis der (id_category = 5) nehmen, die eine boolean wahr/falsch ist, und es auf eine ganze Zahl 0/1 Gießen und Sortieren sie in DESC-Reihenfolge. Dadurch werden alle 5 Datensätze an der Spitze der Ergebnismenge platziert, dann werden die verbleibenden nicht 5 Datensätze wie üblich an zweiter Stelle sortiert id_category Klausel.