#php #mysql
Вопрос:
У меня есть стол, который выглядит так:
ID | app_id | field_id | ценность |
---|---|---|---|
ХХХ | ууу | 9 | имя |
ХХХ | ууу | 2 | фамилия |
Столбец «Значение» содержит такие данные, как Имя, Фамилия, Адрес, адрес электронной почты и так далее. Единственный способ определить, какое значение находится в столбце «значение», — это «field_id». Между тем «app_id» действует как уникальный идентификатор пользователя / идентификатор пользователя.
(Таблица предоставляется плагином WordPress, поэтому, как бы ужасно это ни было, я не могу это изменить.)
Это означает, что для получения имени и фамилии пользователя мне пришлось бы искать 2 строки с одним и тем же идентификатором приложения, а затем получить столбец значения, где field_id равен 9 для имени и 2 для фамилии.
Итак, я хочу распечатать что-то вроде: (псевдокод)
for ($app_id) { if (app_id == $app_id amp;amp; field_id = 9) { $first_name = value } if (app_id == $app_id amp;amp; field_id = 2) { $last_name = value } echo $first_name . $last_name; }
Пока у меня есть только следующий код, который помещает все данные в многомерный массив:
$mysqli = new mysqli("localhost","dbane","dbpass","dbuser"); $mysqli-gt;set_charset("utf8mb4"); $fields = $mysqli -gt; query("SELECT * FROM name_of_table"); $results = $fields-gt;fetch_all(); foreach ($results as $result) { foreach ($result as $key =gt; $value) { /* Lost what to do here */ } }
Как бы я мог получить имя и фамилию каждого пользователя и соединить их вместе?
База данных содержит около 20 000 строк, поэтому использование нескольких запросов mysqli_ не является вариантом, так как время загрузки составляет 10 мин. и создает ужасную нагрузку на сервер.
Комментарии:
1. Маленький момент Все таблицы MySQL несортированы
2. Ну Шаг 1 )
SELECT * FROM name_of_table WHERE app_id = 'yyy'
3.Затем Шаг 2)
SELECT * FROM name_of_table WHERE app_id = 'yyy' and (field_id = 9 OR field_id = 2)
Теперь вы обрабатываете только 2 строки, которые вам действительно нужны, вместо всей таблицы4. PS Если это было натяжкой, вам действительно нужно остановиться и потратить несколько часов на изучение некоторых ОСНОВНЫХ руководств по SQL
5. Спасибо вам за быстрый ответ. Это совсем не было натяжкой, у меня даже есть точно такое решение. Однако мне нужно отсортировать около 20 000 строк данных, и мне нужно не только получить 2 значения, но и 8. Это означает, что 8 из этих вызовов проходят через всю таблицу базы данных
Ответ №1:
Я решил эту проблему, выполнив следующее, с помощью RiggsFolly:
for ($i = $count; $i gt;= ($count - 1000); $i--) { $data = $mysqli -gt; query("SELECT * FROM table_name WHERE app_id = $i AND field_id IN (2,9,15,5,10,11,6,3)"); $names = $data-gt;fetch_all(); foreach ($names as list($a, $b, $c, $d)) { switch ($c) case 9: $first_name = $d; break: case 15: $last_name = $d; break; } }