MySQL调用将两个表与几个相同的行组合在一起

时间:2014-10-14 12:43:29

标签: php mysql sql group-concat

我的问题旨在结合两个表的特定SQL调用。

我有两个表,我无法合并为一个表,因为每天从文件中导入一个表。我需要的是什么,我在这里告诉你:

SQL表1摘录:
enter image description here

SQL表2摘录:
enter image description here

在PHP源代码中,我需要这个结果:

Array(122, 146, 234, 400)  
Array(John, Dave, Sam, Jana)  
Array(SOME, SOME, Array(ONE, TWO, THREE, FOUR, FIVE), SOME)  
Array(Some Text…, More…, Array(More…, More…, More…, More…, More…), More…)  

" num"的行每个必须与表1一起匹配:

Array(male, male, male, female)  
Array(false, true, false, true)  

我发现的是这个问题: MySQL SELECT AS combine two columns into one

所以我可以使用CONCAT来合并ONE, TWO, THREE, FOUR, FIVE。 我可以单独调用每个表并在PHP中构建结果或一起调用两个表。有什么更好的方法?

我不知道的是一个很好的整体概念。请问有人给我一个例子吗?

修改

我现在理解语法。这是一个很好的简短解决方案:

mysql > SELECT DISTINCT num, name, GROUP_CONCAT(DISTINCT prefs ORDER BY prefs SEPARATOR ', ') AS array FROM `table1` AS t1 INNER JOIN `table2` AS t2 ON t1.num = t2.num GROUP BY num ORDER BY num

3 个答案:

答案 0 :(得分:0)

请在MYSQL中使用CONCAT,因为您将直接从一个查询获得结果,而不是通过PHP处理它。

答案 1 :(得分:0)

要获取所需的数据,您可以使用简单的SELECT...JOIN查询:

select
  T1.num,
  T1,name,
  T2.prefs,
  T2.text,
  T1,gender,
  T1.opt,
from
  Table1 as T1
inner join
  Table2 as T2 on T1.num=T2.num
order by
  T1.num

从这里开始,您可以通过在从DB中读取每一行时处理每一行来构建数组(使用带关联提取的PDO)

while ($row=$query_result->fetch(PDO::FETCH_ASSOC))
{
  $a1[]=$row['num'];
  $a2[]=$row['name'];
  $a3[$row['num']][]=$row['prefs']; // Store values in a subarray according to num
  $a4[$row['num']][]=$row['prefs']; // Store values in a subarray according to num
  $a5[]=$row['gender'];
  $a6[]=$row['opt'];
}

不幸的是,您最终会在数组1,2,5,6中输入多个条目。要解决此问题,请使用array_unique

$array1=array_unique($a1);
$array2=array_unique($a2);
$array5=array_unique($a5);
$array6=array_unique($a6);

如果您不想使用array_unique,可以使用:

while ($row=$query_result->fetch(PDO::FETCH_ASSOC))
{
  $a1[$row['num']]=$row['num']; // Gets round the array_unique
  $a2[$row['num']]=$row['name'];// Gets round the array_unique
  $a3[$row['num']][]=$row['prefs']; // Store values in a subarray according to num
  $a4[$row['num']][]=$row['prefs']; // Store values in a subarray according to num
  $a5[$row['num']]=$row['gender']; // Gets round the array_unique
  $a6[$row['num']]=$row['opt']; // Gets round the array_unique
}

但是你需要使用array_values来提取值:

$array1=array_values($a1);
$array2=array_values($a2);
$array5=array_values($a5);
$array6=array_values($a6);

要获得结果多维数组,您必须进行更多处理:

$array4=array();
$array5=array();

//Loop through each sub array
foreach ($a4 as $subArray)
{
  //If there is only one element, store that value, otherwise store the sub-array
  $array4[]=(count($subArray)>1) ? array_values($subArray) : array_shift($subArray));
}

//Loop through each sub array
foreach ($a5 as $subArray)
{
  //If there is only one element, store that value, otherwise store the sub-array
  $array5[]=(count($subArray)>1) ? array_values($subArray) : array_shift($subArray));
}

(你可能通过使用变量变量获得闪存,但为了清楚起见,我选择了单独的循环)

一旦您拥有数组中的数据,您就可以随意使用它。如果要从中构建PHP源代码,请使用var_export($arrayName,true)并将其捕获到变量

这些代码都没有经过实际测试,但希望能指出正确的方向

答案 2 :(得分:0)

试试这个:

$result= mysql_query("select * from table1 t1,table2 t2 where t1.num=t2.num order by t1.prefs asc");

使用函数mysql CONCAT_WS() - >与分隔符连接

CONCAT_WS(",",FIELD_NAME,FIELD_NAME)