Bir xil ustundagi bir nechta qiymatni tanlash va ularni nomlash

* SOLUTION

Bir xil jadvalda bir nechta tanlov mavjud


Buni qanday amalga oshirish kerakligini tushunolmayman. Bir stolda bir nechta kalitlarga so'rov berishni so'rayman va ularni nomlash bilan qaytarib olmoqchiman

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);

The query itself is working fine. But I need to name 'KEY1', 'KEY2', 'KEY3' etc in the array that's returned. Now everything is returned in "[meta_value] => string", I need it to be "[key1] => string", "[key2] => string", "[key3] => string" etc.

*EDIT There seams to be some major missunderstanding as to what I'm asking. So I'll try to clarify. I need the returned array to say that KEY1 has a key of KEY1 with the value corresponding to KEY1 in meta_value etc, i.e.

array({[
    [KEY1] => [KEY1_VALUE],
    [KEY2] => [KEY2_VALUE]
]});

hozir shunday ko'rinadi

array({[
    [meta_value] => [VALUE1],
    [meta_value] => [VALUE2]
]});

Muammo shundaki, men foreachdagi aniq qiymatlarni aniqlay olmayman, chunki har bir narsa [meta_value] kalitiga ega.

2
Bizga jadval tuzilishini va ayrim ma'lumotlarni ko'rsatish mumkinmi? Sizning Applications iborasi faqatgina meta_value so'raydi, shuning uchun hammasi siz olishadi.
qo'shib qo'ydi muallif mickmackusa, manba
qo'shib qo'ydi muallif mickmackusa, manba
Har bir meta kalitning o'ziga xosligi bormi? yoki bir xil meta tugmachani turli foydalanuvchilar yoki biror narsa uchun bir necha marta rostlash mumkinmi?
qo'shib qo'ydi muallif xQbert, manba
Istagan qiymatlarni qabul qiladigan yagona ustun @mickmackusa meta_value ustunida joylashgan. "IN" tugmachalari meta_key ustunida joylashgan. Undan tashqari, faqat bitta id so'zi mavjud. Savolni hozir yangilash.
qo'shib qo'ydi muallif axelra82, manba

6 javoblar

Mana, men qidirayotgan narsalarimga javob beradigan savol.

Bir xil jadvalda bir nechta tanlov mavjud

Men savolni juda murakkablashtirishi mumkin yoki faqat nimaga erishmoqchi bo'lganimni to'g'ri tushuntirib berolmaganimga ishonaman. Baribir, barcha javoblaringiz uchun tashakkur!

1
qo'shib qo'ydi
Iltimos, bu savolni ikki nusxadagi savol deb qabul qilsangiz, sizning savolingizni olib tashlang - ta'rif bo'yicha StackOverflow-ga shaffof qo'shasiz. Va sizning bog'langan javobingiz ikki nusxada edi. Sizga yordam berish uchun vaqt sarflaydigan boshqa kishilar sizning muammolaringizni tushunib, savolingizga javob berishingiz, uni olib tashlashingiz va uni javob sifatida belgilashingiz mumkin.
qo'shib qo'ydi muallif mickmackusa, manba

Agar men tushunmaydigan bo'lsam, qo'shimcha tushuntirishlarni taklif eting ...

$tq="SELECT metas.meta_key,metas.meta_value ...

Qaytadi:

[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'

Ko'rish/ishlov berish vaqti kelganida, ularni har bir qatorda birlashtirish mumkin.

0
qo'shib qo'ydi
Men avvalgi sharhimni rad etishim kerak edi. Sinovdan so'ng men foreach döngünde bu ishlamaydi tushunib etdim. Har bir kalit nomi tanlanadi, foreach döngüsü kalit uchun X sonini ishlatadi. Shunday qilib, mening haqiqiy natijalar qatori 100 bo'lsa va menda 4 tugma mavjud bo'lsa, u holda qator 400 ga teng bo'ladi va har biriga qo'shiladi. SQL so'rovini o'zgartirishning bir yo'li kerak, bu muammoning ildizidir. SELECT (SELECT ...) bilan key1 (SELECT ...) AS kalit2 bilan ishlayapman, ammo hech qanday foyda yo'q. Ammo yana, muammo, SQL so'rovini to'g'ri shakllantirishni bilmasligimdir. Ularning hammasi bir xil ustunda joylashgan har bir kalitni nomlash uchun
qo'shib qo'ydi muallif axelra82, manba

MySQL AS kalit so'zini ishlatib, qiymatni nomlashingizga imkon beradi

SELECT id AS Key1, meta_key AS Key2, meta_value AS Key3 
FROM ...
0
qo'shib qo'ydi
OHHHHH, siz ularga qo'shilishni xohlaysizmi? Wordpress e-commerce ma'lumotlar strukturasida mutlaqo isrofgar va odatiy emasdir. woocommerce meta_data konsolidatsiyasini ko'rib chiqadigan boshqa javobni yuboradi.
qo'shib qo'ydi muallif tony gil, manba
Javob uchun rahmat. Ha, buni bilaman. Lekin men KEY1ni ['KEY1'] => KEY1_VALUE, ['KEY2'] => KEY2_VALUE va boshqalar sifatida qaytarilishini istaganimni qanday e'lon qilishim mumkin? Barcha qiymatlar bir xil qatorda va men "IN" dan meta_key bo'lgan har bir qiymatni (meta_value) topishim kerak. Men bir nechta tanlov qilishim kerakmi? Agar shunday bo'lsa, qanday qilib? Buning ma'nosi shuki, IN qismida har bir KEY nomini aytib o'tishim kerak.
qo'shib qo'ydi muallif axelra82, manba

WooCommerce foydalanuvchilariga tavsiya etilgan yana bir yondashuv, ma'lumotlaringizni ko'rinishda birlashtirish va ko'rinishni so'rashdir.

Men bu javobni boshqa SO postiga yozaman, lekin asosiy tuzilmani quyidagi SQLda ko'rish mumkin

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 jumlasi har meta_value har bir POST ID boshiga bitta qatordan iborat bo'lishini kafolatlaydi va har bir meta_key . Ushbu misolda men 4 tugmachani ishlataman (quyidagi WP_POSTMETA ma'lumotlarini ko'ring). Bunga erishish uchun JOIN kodini o'zi bilan birga x-1 marta (bu erda x ) yig'iladigan turli xil kalitlarning soni bo'lishi kerak.

--------------------------------------------------------------------------
ID        POST_ID               META_KEY                META_VALUE
--------------------------------------------------------------------------
0001      0001                  CustomerLN              Test
0002      0001                  CustomerFN              Tester
0003      0001                  Payment_Type            PayPal
0004      0001                  Invoice_Total           $200
0005      0002                  CustomerLN              Doe
0006      0002                  CustomerFN              John
0007      0002                  Payment_Type            CC-Mastercard
0008      0002                  Invoice_Total           $1000
0
qo'shib qo'ydi

Juft narsalar:

  1. chap burchakda o'ng tomonning chap tomonidagi qiymatlar bilan birlashtirilgan chap burchakdan foydalanib, chap qo'shilish ichki qo'shilish kabi harakat qilish uchun sabab bo'ladi. Agar ichki qo'shilishni istasangiz, ichki qo'shilishni ayting, agar chap qo'shilishni istasangiz, unda ishtirok etish shartlarini o'zgartiring.
  2. Agar har bir meta_key jadvalga (yoki jadvaldagi postga) noyob deb hisoblasak ... keyin har bir tugmachaning maksimal qiymatini tanlash nulllarni bir qatorga birlashtiradi. va guruh to'g'ri satrlarni birlashtirib, maksimum qiymatni 1 qiymatiga qaytarish imkonini beradi.

Har bir meta kalitning yagona (yoki hech bo'lmaganda post_ID uchun yagona) deb hisoblasak,

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
0
qo'shib qo'ydi

Buni sinab ko'ring va ehtiyojlaringizga mos ravishda almashtiring.

$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++;
 }
0
qo'shib qo'ydi
Javob uchun rahmat. Lekin PHP va qatorni boshqarish bilan bog'liq muammolar yo'q. Muammo so'rovda. Har bir qiymat bir kalitga mos kelar ekan, men bir qatorda kalit va qiymatga ega bo'lishim kerak. Shunday qilib, agar KEY1 VALUE1 ni tutgan bo'lsa, KEY2 qiymati VALUE2 ni tutadi va boshqalar. $ Key => $ val bilan bir foreachga ega bo'lishni xohlayman va agar $ key = KEY1 boshqa biror narsa qilish uchun $ qiymatini ishlatsa. Boshqacha qilib aytadigan bo'lsak, SQL so'rovi bilan bog'liq muammo har bir qiymat ['meta_value'] kalitiga ega bo'lsa, men uni nomlanishi kerak.
qo'shib qo'ydi muallif axelra82, manba
Men hali ham muammolarni tushunganingizga amin emasman. Key1, Key2 va boshqalar alamadim. Meta_valueni barcha natijalar uchun kalit sifatida qabul qilaman. Tegishli qiymat uchun nom berish uchun kalit kerak. Ie. Nima uchun bu PHP muammosi emas (bu kodning bir qismi bo'lsa ham), muammo SQLda yotadi. Meta_table-dan meta_values ​​ni meta_value = key1 AS key1-ni tanlang va keyin har bir tugmachani bajarish uchun tanlay olasizmi?
qo'shib qo'ydi muallif axelra82, manba
kerakli natijalar namunasini (haqiqiy) qo'sha olasizmi? Men tushundim: Key1 = '' 12332kh43h3hi8h4h93o493hh489h4r; Key2 = '' 4794279984brb9r89r6 99h4r; Key3 = '' fofiohihfif7ef7we7foifegfuf89h4r; va hokazo...
qo'shib qo'ydi muallif Carlos R, manba
Endi siz nimani qidirayotganingizni tushunaman, men taklif qilgan narsa noto'g'ri yondashuv.
qo'shib qo'ydi muallif Carlos R, manba
PhP |BotsUz
PhP |BotsUz
93 ishtirokchilar

Phpni o'rganishni Hohlasangiz https://t.me/joinchat/AAAAAE-KRc5dd5tPMmGmWA A'zo bo'lin