Как вывести имена из базы MySQL?

256
06 марта 2017, 13:04

Как вывести из базы в колонке 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;
?>
Answer 1

У вас на корню не правильный подход к решению обычных задач. Вот один из вариантов решения задачи:

Вам нужно реализовать связи между таблицами. В вашей таблице, колонки 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 принадлежит.

Answer 2

Ну вот вы перебираете результы своего запроса по строкам while ($row = $db->get_row($sql)) { }. Ну и всё. Перед этим циклом заводите счётчик или массив. Каждое получаемое в цикле значение режете по делителю '|' функцией explode(delimiter, string). В результате получаете массив всех значений в вашей строчке. Ну а дальше уже делаете с этим массивом что душе угодно, Перебираете, сравниватете, получаете по индексу. Счётчик увеличиваете свой, если нашли нужное. И т.д.

Answer 3

Как то так:

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 даст неверный результат.

READ ALSO
Возможно ли обновлять скрипт помимо AJAX?

Возможно ли обновлять скрипт помимо AJAX?

Я создаю Telegram бота, и вот для теста я хочу, чтобы он отвечал на сообщения в зависимости от контекстаНо вот в чем дело, сообщение от бота не отправится...

232
Как получить видео пользователей?

Как получить видео пользователей?

Как я понимаю, есть 2 типа каналов:

328
Непонятный синтаксис

Непонятный синтаксис

Зачем нужен данный синтаксис, ведь тип результата не вычисляется автоматом?

241
Парсинг принтеров

Парсинг принтеров

Помогите распарсить эту сроку: интересуют такие параметры на название принтера и дата установки

254