2017-02-19 72 views
-2

*解决方案选择来自同一列的多个值和命名他们

Multiple selects on the same table


我无法弄清楚如何正确地做到这一点。我想查询一个表中的一列中的几个键,并返回它们的命名

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”等

*编辑 有接缝是我所问的一些重大missunderstanding。所以我会尽力澄清。我需要返回数组说KEY1与对应于meta_value等KEY1值KEY1的关键,即

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

现在它看起来像这样

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

所以问题是,我无法在foreach中定位特定值,因为所有内容都有[meta_value]的关键字。

+0

你能告诉我们表结构和一些数据吗?你的SELECT语句只要求'meta_value',这就是你将要得到的。 – mickmackusa

+0

@mickmackusa我想要的值的唯一列是在meta_value列中。 “IN”中的键位于meta_key列中。除此之外,只有一个id列。现在更新问题。 – axelra82

+0

是每个元密钥唯一吗?或coudl相同的元键被列出多次为不同的用户或东西? – xQbert

回答

1

这是一个问题,它回答了我正在寻找的东西。

Multiple selects on the same table

我相信我可能已经太多了,我的问题复杂,或只是不能够正确地解释什么,我想要的目的。无论如何,谢谢你的答案!

+0

如果您确认这是一个重复问题,请删除您的问题 - 根据定义,您正在向StackOverflow添加膨胀。你连接的答案是重复的。如果问一个措辞不太好的/有题目的问题并不是很运动,其他人会花时间来帮助你,然后你意识到你的问题,并为你的问题提供一个答案,把它提出来,并将其标记为答案。 – mickmackusa

0

MySQL允许你命名的值,用AS关键字

SELECT id AS Key1, meta_key AS Key2, meta_value AS Key3 
FROM ... 
+1

感谢您的回答。是的,我知道这一点。但我怎么能声明我想KEY1返回['KEY1'] => KEY1_VALUE,['KEY2'] => KEY2_VALUE等?所有的值都在同一行,我需要找到每个值(在meta_value),它具有我的“IN”中的meta_key。我可能需要做多个选择吗?如果是这样,怎么样?关键是我需要在IN部分命名每个KEY。 – axelra82

+0

OHHHHH,你想加入他们吗? Wordpress电子商务在其数据结构中完全是浪费和非正统的。将发布另一个答案,我将解决woocommerce meta_data的整合问题。 –

0

试试这个,更换,以满足您的需求。

$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++; 
} 
+1

感谢您的回答。但是我对PHP和数组处理没有任何问题。问题出在查询中。由于每个值都对应一个键,所以我需要将键和值放在同一个数组中。所以,如果KEY1保持VALUE1,KEY2保存VALUE2等,我希望能够通过$ key => $ val到foreach,并且说如果$ key = KEY1使用$ value做别的事情。换句话说,SQL查询的问题是每个值都有关键字['meta_value'],而我需要它的名字。 – axelra82

+0

你可以添加一个例子(真实)所需的结果吗?我明白了:Key1 =''12332kh43h3hi8h4h93o493hh489h4r; Key2 =''4794279984brb9r89r6 99h4r; Key3 =''fofiohihfif7ef7we7foifegfuf89h4r;等等...... –

+0

我还不确定你是否理解这个问题。我没有得到Key1,Key2等。我得到meta_value作为所有结果的关键。我需要为相应的值命名密钥。即为什么这不是PHP的问题(尽管它是代码的一部分),问题在于SQL。我是否需要以不同的方式说明meta_table中的meta_values,其中meta_value = key1 AS key1 ...然后针对每个键执行此操作? – axelra82

0

如果我误解,请您提供更多的澄清......

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

你只需每行中配对值在一起的时候,是时候显示/处理它们,对吗?

+0

我不得不收回我以前的评论。经过测试,我意识到在foreach循环中这是行不通的。每个键都将被命名,foreach循环将为键运行X次。所以如果我的实际结果数组是100,并且我有4个键,那么数组变为400,并且每个都附加到数组。我需要以某种方式更改SQL查询,这是问题的根源。我想用SELECT(SELECT ...)AS key1,(SELECT ...)AS key2但无济于事。但是,问题是,我不知道如何正确地制定SQL查询。它将所有列在同一列中的每个关键字命名为 – axelra82

0

两件事情:

  1. 使用其中的左子句从左边右边值加入加入导致左加入像内采取行动加入。如果你想要一个内部连接,比如说内部连接,如果你想要一个左连接,将where标准移动到连接。
  2. 如果我们假设每个meta_key对于表(或表中的帖子)是唯一的,那么为每个键选择最大值将会将空值组合成一行。并通过组合正确的行并允许max返回1值。

如果我们可以假设每个元关键是唯一的(或至少独有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 
0

另一种方法,它被推荐用于WooCommerce用户是巩固你的数据在一个视图,然后查询视图。

我细讲在this answer to another SO post,但其基本结构可以在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     Invoice_Total   $200 
0005  0002     CustomerLN    Doe 
0006  0002     CustomerFN    John 
0007  0002     Payment_Type   CC-Mastercard 
0008  0002     Invoice_Total   $1000 
相关问题