Как вывести из базы в колонке xfields только слово после |label| не во всех ячейках они присутствуют.
Эти я чейки с таким содержанием
audio|name.mp3||image|name.jpg||wave|name.jpg||data|06.03.2017||label|Vision
или
audio|name.mp3||image|name.jpg||wave|name.jpg||data|06.03.2017
или
audio|name.mp3||image|name.jpg||wave|name.jpg||label|Vision
Должно получится примерно так:
Vision - 50 треков
Spinnin - 35 треков
Sony - 20 треков
....
Делаем по порядку, этот код выводит все поля xfields
audio|name.mp3||image|name.jpg||wave|name.jpg||data|06.03.2017||label|Vision
и т.д. Как вывести из этой строки только слово Vision? И Подсчитать в скольких ячейках оно присутствует?
<?php
if(!defined('DATALIFEENGINE')) {
die("Hacking attempt!");
}
global $config;
$limit = $limit ? intval($limit) : "20";
if (!$r_short) {
$sql = $db->query("SELECT * FROM " . PREFIX . "_post ORDER BY id DESC LIMIT 0,{$limit}");
while ($row = $db->get_row($sql)) {
$r_short .= "<p>{$row['xfields']}</p>";
}
}
echo $r_short;
?>
PS
Сделал чтобы выводились только эти слова, которые после label|. Нужно теперь чтобы повторяющиеся слова подсчитывались, и не выводилась пустота, если нет в ячейке слова label|.
<?php
if(!defined('DATALIFEENGINE')) {
die("Hacking attempt!");
}
global $config;
$limit = $limit ? intval($limit) : "20";
if (!$r_short) {
$sql = $db->query("SELECT * FROM " . PREFIX . "_post ORDER BY id DESC LIMIT 0,{$limit}");
while ($row = $db->get_row($sql)) {
echo '<p>';
echo explode('label|', $row['xfields'])[1];
echo '</p>';
}
}
echo $r_short;
?>
У вас на корню не правильный подход к решению обычных задач. Вот один из вариантов решения задачи:
Вам нужно реализовать связи между таблицами. В вашей таблице, колонки xfields не должно быть в принципе.
Вместо этой колонки, нужно завести отдельную таблицу в базе данных xfields.
Вы не привели название текущей вашей таблицы, поэтому дадим ей название popka
Структура таблицы xfields будет примерно такая:
id - айдишник
xfield - ваш кейворд
popka_id - айдишник, элемента (хозяина) в таблице popka
Таким образом, для того чтобы получить кол-во "xfield'ов" например для элемента popka с id 123 достаточно выполнить следующий запрос
SELECT count(*) from `xfields` where `xfields`.`popka_id` = 123
для того чтобы подсчитать сгруппированное кол-во "хфилдов" для "попки" 123 запрос не мудреный:
SELECT count(*) as 'count', `xfield` FROM `xfields` WHERE `xfields`.`popka_id`=123 GROUP BY `xfields`.`xfield` ORDER BY count(*) DESC
Ну и естественно, при создании нового xfield'a нужно указывать хозяина, которому данный xfield принадлежит.
Ну вот вы перебираете результы своего запроса по строкам while ($row = $db->get_row($sql)) { }. Ну и всё. Перед этим циклом заводите счётчик или массив. Каждое получаемое в цикле значение режете по делителю '|' функцией explode(delimiter, string). В результате получаете массив всех значений в вашей строчке. Ну а дальше уже делаете с этим массивом что душе угодно, Перебираете, сравниватете, получаете по индексу. Счётчик увеличиваете свой, если нашли нужное. И т.д.
Как то так:
select substring_index(substr(xfields,instr(concat('||',xfields),'||label|')+6),'|',1) label,
count(1) cnt
from x_post
where concat('||',xfields) like '%||label|%'
group by label
Для работы с такими строками изучите строковые функции MySQL. Хотя лучше было бы доработать структуру БД. Даже если данные в эту таблицу пишет некий движок можно доделать БД не меняя его кода. Для этого вам надо завести отдельную таблицу с полями post_id, key, val в которой бы ключи и их значения лежали бы отдельными строками. Заполнять эту таблицу можно автоматически триггером на изменение таблицы post. Триггер будет брать xfields, разбивать его на части по || и вставлять в отдельную таблицу отдельными строками. При некотором желании можно это сделать даже одним запросом.
А ваш php строку получал не правильно. Так как это некий движок, то вы не можете гарантировать что поле label будет последним. И если оно будет не последним ваш explode даст неверный результат.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники