Как вывести из базы в колонке 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 даст неверный результат.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я создаю Telegram бота, и вот для теста я хочу, чтобы он отвечал на сообщения в зависимости от контекстаНо вот в чем дело, сообщение от бота не отправится...
Зачем нужен данный синтаксис, ведь тип результата не вычисляется автоматом?
Помогите распарсить эту сроку: интересуют такие параметры на название принтера и дата установки