2016-04-14 14 views
0

Ich habe zwei Tabellen: Tabelle 1 und Tabelle 2php sortieren Daten nach der 2. Tabelle

enter image description here

Ich brauche die Daten zu sortieren, wie in der Tabellenansicht angezeigt.

Ich habe bereits genommen:

foreach($Table1 as $row1) 
{ 
    foreach($Table2 as $row2) 
    { 
      if($row1->id == $row2->selected_id) 
      { 
        show?? 
      } 
    } 

} 

bitte keine Sorgen über Anfragen: es ist gesorgt eigentliche Problem ist:

es nur ein Problem: Tabelle 1 erzeugt aus 20 verschiedenen Funktions und sammelt zu Tabelle 1. und der Benutzer wählt aus, was er anzeigen möchte, indem er auswählt. Wenn also insgesamt 7 Zeilen vorhanden sind und der Benutzer 3 auswählt, werden die Daten so sortiert, dass 3 Zeilen in den ersten Zeilen und 3 in den Zeilen angezeigt werden.

ist dies der richtige Weg? oder gibt es viel einfacher Weg Ich benutze MySQL

bitte helfen Sie jemandem?

Antwort

0

Sie dies erreichen können in einer einzigen Abfrage, keine Notwendigkeit, eine Schleife über beiden Tabellen danach

Select t1.id, t1.name 
    From Table1 t1 
Left Join Table2 t2 On t1.id = t2.selected_id 
Order By t2.id, t1.id 
+0

gibt es nur ein Problem: Tabelle 1 wird aus 20 verschiedenen Funktionen generiert und sammelt sich in Tabelle 1. und der Benutzer wählt durch Auswählen aus, welche Daten angezeigt werden sollen. Wenn also insgesamt 7 Zeilen vorhanden sind und der Benutzer 3 auswählt, werden die Daten so sortiert, dass 3 Zeilen in den ersten Zeilen und 3 in den Zeilen angezeigt werden. –

0

Sie eine effektive SQL-Abfrage verwenden können, sofort an den Finaltisch zu bekommen, wie so:

Query1 :

SELECT t2.id, t1.name 
FROM t2 
INNER JOIN t1 
ON t2.id=t1.id; 

Dies würde Ausgang die ersten 4 Zeilen und dann:

Query2:

SELECT id, name 
FROM t1 
WHERE id NOT IN (SELECT id FROM t2); 

ausgegeben würden die letzten 4 Zeilen, danach einfach eine UNION:

Schluss query:

Query1 UNION Query2; 

Explizit:

(SELECT t2.id, t2.name 
     FROM t2 
     INNER JOIN t1 
     ON t2.id=t1.id) 
UNION 
(SELECT id, name 
     FROM t1 
     WHERE id NOT IN (SELECT id FROM t2)); 

Bit kompakter:

(SELECT t2.* 
      FROM t2 
      INNER JOIN t1 
      ON t2.id=t1.id) 
    UNION 
    (SELECT * 
      FROM t1 
      WHERE id NOT IN (SELECT id FROM t2)); 
+0

gibt es nur ein Problem: Tabelle 1 wird aus 20 verschiedenen Funktionen generiert und sammelt sich in Tabelle 1. und der Benutzer wählt aus, was er anzeigen möchte, indem er auswählt. Wenn also insgesamt 7 Zeilen vorhanden sind und der Benutzer 3 auswählt, werden die Daten so sortiert, dass 3 Zeilen in den ersten Zeilen und 3 in den Zeilen angezeigt werden. –

+0

Sortiert die ausgewählten Zeilen nicht zuerst und dann die verbleibenden Zeilen, die Sie möchten? –

+0

genau! aber es kann nicht durch Joing getan werden: Weil Tabelle 1 keine mySQL-Tabelle ist. aber table2 ist eine Tabelle in mySQL, die aus table1 mit IDs –

0

Sie unter Abfrage tun können.

Select t1.* from table2 t2 inner join table1 t1 on t2.selected_id = t1.id order by t2.id 
UNION 
Select t1.* from table1 t1 where t1.id NOT IN (select t2.id from table2 t2 inner join table1 t1 on t2.selected_id = t1.id) order by t1.id 
+0

gesammelt wird, gibt es nur ein Problem: Tabelle 1 wird aus 20 verschiedenen Funktionen generiert und sammelt sich in Tabelle 1. und Benutzer wählt aus, welche sie anzeigen möchten, indem Sie auswählen. Wenn also insgesamt 7 Zeilen vorhanden sind und der Benutzer 3 auswählt, werden die Daten so sortiert, dass 3 Zeilen in den ersten Zeilen und 3 in den Zeilen angezeigt werden. –

0

Sie können Union nutzen neben den nicht ausgewählten zuerst, dann die ausgewählten Zeilen zu zeigen, mit kombiniert (wo in) und (soweit nicht in) Klauseln ist neben hier die Abfrage:

(select t1.id, t1.name from table1 t1 where t1.id 
in (select t2.selected_id from table2 t2)) union 
(select t1.id , t1.name from table1 t1 where t1.id 
not in (select t2.selected_id from table2 t2)); 
0

Sie können bei Abfrage: Reihenfolge nach Feld() verwenden. In der field() -Funktion zweite Tabelle Daten als Zeichenfolge Komma getrennt.

0

Wie pro Ihre additional question, so scheint es, dass Sie nicht MySQL wollen dafür verwenden, und dass Ihre Benutzerauswahl ist in der Tat ein Array wie diese:

$filter = [ 3, 4, 7, 8 ]; 

Filter das Original $Table1 Array mit array_reduce. Mit diesem Verfahren erhält man ein Array ($filtered) mit Benutzerauswahl in Elemente 0 und anderen Werten in Elemente 1:

$filtered = array_reduce 
(
    $Table1, 
    function($carry, $item) use($filter) 
    { 
     $index = !in_array($item['id'], $filter); 
     $carry[$index][] = $item; 
     return $carry; 
    }, 
    [ [], [] ] 
); 

Dann verschmelzen $filtered Daten mit call_user_func_array:

$result = call_user_func_array('array_merge', $filtered); 

Ergebnis:

Array 
(
    [0] => Array 
     (
      [id] => 3 
      [name] => C 
     ) 
    [1] => Array 
     (
      [id] => 4 
      [name] => D 
     ) 
    [2] => Array 
     (
      [id] => 7 
      [name] => G 
     ) 
    [3] => Array 
     (
      [id] => 8 
      [name] => H 
     ) 
    [4] => Array 
     (
      [id] => 1 
      [name] => A 
     ) 
    [5] => Array 
     (
      [id] => 2 
      [name] => B 
     ) 
    [6] => Array 
     (
      [id] => 5 
      [name] => E 
     ) 
    [7] => Array 
     (
      [id] => 6 
      [name] => F 
     ) 
) 
+0

Das scheint richtig zu sein, aber es scheint mir nicht möglich zu sein, es umzusetzen. freundlicherweise können Sie mir ein Arbeitsbeispiel zeigen ??? –

+0

Oben ist ein funktionierendes Beispiel. '$ Table1' ist Ihr ursprüngliches Array,' $ filter' ist Ihre Benutzerauswahl, '$ result' ist das resultierende Array. – fusion3k