*РЕШЕНИЕ
Несколько выборок на одной и той же таблице
Я не могу понять, как сделать это правильно. Я хочу запросить таблицу для нескольких ключей в одном столбце и вернуть их с именами
id | meta_key | meta_value |
1 | KEY1 | KEY1_VALUE |
2 | KEY2 | KEY2_VALUE |
3 | KEY3 | KEY3_VALUE |
etc.
$tq="SELECT metas.meta_value
FROM meta_table AS metas
LEFT JOIN post_table AS posts
ON metas.post_id = posts.ID
WHERE metas.meta_key IN ('KEY1', 'KEY2', 'KEY3')
AND posts.post_status = 'status'
AND posts.post_type = 'type'";
$tr=$dbc->query($tq);
var_dump($tr);
Сам запрос работает нормально. Но мне нужно назвать «KEY1», «KEY2», «KEY3» и т. Д. В возвращаемом массиве. Теперь все возвращается в «[meta_value] => string», мне нужно, чтобы оно было «[key1] => string», «[key2] => string», «[key3] => string» и т. Д.
*РЕДАКТИРОВАТЬ
Там швы, чтобы быть некоторые основные недоразумения относительно того, что я спрашиваю. Поэтому я постараюсь уточнить. Мне нужен возвращенный массив, чтобы сказать, что KEY1 имеет ключ KEY1 со значением, соответствующим KEY1 в meta_value и т. Д., Т.е.
array({[
[KEY1] => [KEY1_VALUE],
[KEY2] => [KEY2_VALUE]
]});
сейчас это выглядит так
array({[
[meta_value] => [VALUE1],
[meta_value] => [VALUE2]
]});
Так что проблема в том, что я не могу указывать конкретные значения в foreach, потому что все имеет ключ [meta_value].
Вот вопрос, который отвечает именно то, что я искал.
Несколько выборок на одной и той же таблице
Я считаю, что, возможно, слишком усложнил свой вопрос или просто не смог правильно объяснить, чего я пытался достичь. В любом случае, спасибо за все ваши ответы!
MySQL позволяет вам назвать значение, используя AS
ключевое слово
SELECT id AS Key1, meta_key AS Key2, meta_value AS Key3
FROM ...
Попробуйте это и замените его в соответствии с вашими потребностями.
$tr=$dbc->query($tq);
// try this piece of code
$data['records'] = $tr->result();
$key = 0;
foreach($records as $r)
{
$meta_array = array('key'.$key => '$r');
$key++;
}
Если я неправильно понимаю, пожалуйста, дайте больше разъяснений …
$tq="SELECT metas.meta_key,metas.meta_value ...
Вернусь:
[0][meta_key]='KEY1'
[0][meta_value]='KEY1_VALUE'
[1][meta_key]='KEY2'
[1][meta_value]='KEY2_VALUE'
[2][meta_key]='KEY3'
[2][meta_value]='KEY3_VALUE'
Вы можете просто соединить значения в каждой строке вместе, когда пришло время их отображать / обрабатывать, верно?
Пара вещей:
Если мы можем предположить, что каждый мета-ключ уникален (или, по крайней мере, уникален для post_ID)
SELECT
metas.post_ID,
max(CASE WHEN metas.meta_key = 'KEY1' then metas.meta_value end) as Key1,
max(CASE WHEN metas.meta_key = 'KEY2' then metas.meta_value end) as Key2,
max(CASE WHEN metas.meta_key = 'KEY3' then metas.meta_value end) as Key3,
FROM meta_table AS metas
LEFT JOIN post_table AS posts
ON metas.post_id = posts.ID
AND posts.post_status = 'status'
AND posts.post_type = 'type'
WHERE metas.meta_key IN ('KEY1', 'KEY2', 'KEY3')
GROUP BY metas.post_ID
Другой подход, который рекомендуется для пользователей WooCommerce, состоит в том, чтобы объединить ваши данные в представлении и затем запросить представление.
Я вхожу в детали в этот ответ на другой пост SO, но базовую структуру можно увидеть в SQL ниже
CREATE VIEW WP_TRANSACTIONS AS
SELECT WP_POSTMETA.Post_ID AS Post_ID, WP_POSTMETA.CustomerLN AS CustomerLN, [table_name2].CustomerFN AS CustomerFN, [table_name3].Payment_Type AS Payment_Type, [table_name4].Meta_Value AS Invoice_Total
FROM WP_POSTMETA
JOIN WP_POSTMETA AS [table_name2] ON WP_POSTMETA.Post_ID = [table_name2].Post_ID
JOIN WP_POSTMETA AS [table_name3] ON WP_POSTMETA.Post_ID = [table_name3].Post_ID
JOIN WP_POSTMETA AS [table_name4] ON WP_POSTMETA.Post_ID = [table_name4].Post_ID
WHERE WP_POSTMETA.Meta_Value = "CustomerLN"AND [table_name2].Meta_Value = "CustomerFN"AND [table_name3].Meta_Value = "Payment_Type"AND [table_name4].Meta_Value = "Invoice_Total"
WHERE
пункт гарантирует, что у вас будет одна строка на POST ID
с каждым meta_value
Вы хотите, как отдельный столбец, соответствующий каждому meta_key
, В этом примере я использую 4 ключа (см. Данные WP_POSTMETA ниже). Чтобы достичь этого, нужно JOIN
стол с собой x-1
раз (где x
количество различных ключей, которые будут собраны).
-------------------------------------------------------------------------- ID POST_ID META_KEY META_VALUE -------------------------------------------------- ------------------------ 0001 0001 CustomerLN Test 0002 0001 CustomerFN Tester 0003 0001 Payment_Type PayPal 0004 0001 Счет-фактура $ 200 0005 0002 CustomerLN Doe 0006 0002 ЗаказчикFN Джон 0007 0002 Payment_Type CC-Mastercard 0008 0002 Счет-фактура $ 1000