Heim  >  Artikel  >  Backend-Entwicklung  >  Unterstützt PHP MySQL Select das Auflösen von Feldern und sortiert sie dann nach Werten?

Unterstützt PHP MySQL Select das Auflösen von Feldern und sortiert sie dann nach Werten?

WBOY
WBOYOriginal
2016-08-04 09:20:211088Durchsuche

1. Das Format eines Feldes in der Tabelle ist beispielsweise wie folgt: Daten 1|||||Daten 2|||||Daten 3
2. Jetzt möchte ich die Daten in $ aufteilen data[0],$data[ 1], $data[3] und dann nach $data[3]
3 sortieren.
4. Als absoluter Neuling ist die Beschreibung möglicherweise nicht standardisiert, aber die Bedeutung sollte klar sein.

Antwortinhalt:

1. Das Format eines Feldes in der Tabelle ist beispielsweise wie folgt: Daten 1|||||Daten 2|||||Daten 3
2. Jetzt möchte ich die Daten in $ aufteilen data[0],$data[ 1], $data[3] und dann nach $data[3]
3 sortieren.
4. Als absoluter Neuling ist die Beschreibung möglicherweise nicht standardisiert, aber die Bedeutung sollte klar sein.

Es kann implementiert werden, aber wenn es auf MySQL-Ebene implementiert wird, kann es zu einer größeren Belastung der Datenbank führen.
Sie können erwägen, es im PHP-Programm zu sortieren und dann die Daten basierend auf der ID-Sequenz von MySQL abzurufen .

<code><?php
header('Content-Type: text/plain; charset=utf-8');
//$db = new mysqli('127.0.0.1','user','pass','dbname',3306);
//$arr = $db->query('SELECT id,field FROM table')->fetch_all(MYSQLI_ASSOC);
//假设取出来的数据结构如下
$arr = array(
    array('id' => 1, 'field' => '数据1|||||数据2|||||256'),
    array('id' => 2, 'field' => '数据1|||||数据2|||||128'),
    array('id' => 3, 'field' => '数据1|||||数据2|||||512'),
);
foreach($arr as $k => $v) {
    //把field字段的内容转成一个数组比如array('数据1','数据2','256'),方便后面排序
    $arr[$k]['field'] = explode('|||||', $v['field']);
}
//根据field字段里的第三个元素对数组进行排序
uasort($arr, function($a, $b) {
    if($a['field'][2]===$b['field'][2]) return 0;
    //下面这句话的意思就是,如果前面的a大过后面的b,就返回1,返回1表示交换顺序,也就是小的数在前面,由小到大升序排列.
    else return ($a['field'][2] > $b['field'][2]) ? 1 : -1;
});
foreach($arr as $k => $v) {
    $ids[] = $v['id'];
}
$ids = implode(',', $ids); //ID序列为2,1,3
//按照ID序列的顺序查询MySQL
//SQL语句为 SELECT * FROM table WHERE id IN(2,1,3) ORDER BY FIELD(id,2,1,3)
$sql = "SELECT * FROM table WHERE id IN($ids) ORDER BY FIELD(id,$ids)";
//$ret = $db->query($sql)->fetch_all();</code>

Wenn die Datenmenge groß ist, können Sie erwägen, die von PHP arrangierte ID-Sequenz zwischenzuspeichern.
ORDER BY FIELD(id,$ids) Dieser Vorgang führt auch zu Leistungsproblemen, wenn die Datenmenge groß ist.
Dies können Sie in Betracht ziehen, $ids basierend auf der tatsächlichen Situation zu segmentieren. Sortieren Sie beispielsweise 20 Elemente von 0 bis 19 auf der zweiten Seite. Auf diese Weise wird eine benutzerdefinierte Sortierung kleiner Datenmengen vorgenommen viel weniger Druck auf MySQL

Das hat nichts mit PHP zu tun. Sie können eine Funktion mit MySQL erstellen und diese dann zum Sortieren verwenden:

<code>CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
       LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
       delim, '');</code>
<code>SELECT * FROM test_table order by SPLIT_STRING(test_tablecol, '|||', 3);</code>

Es kann implementiert werden, ist jedoch sehr mühsam und sehr ineffizient. Die übliche Lösung für diese Anforderung besteht darin, die Tabellenstruktur zu ändern.

Aus rein logischer Sicht kann SQL tatsächlich sehr komplexe Dinge tun, aber glauben Sie, dass Sie geschlagen sein werden, wenn die Ausführung einer Abfrage mehrere Minuten dauert und Ihre Familienmitglieder es herausfinden?

Es wird empfohlen, PHP zum Sortieren nach der Abfrage zu verwenden, nicht MySQL

substring_index von mysql

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn