如何从2列中检索每个数字组合

时间:2014-01-13 18:22:47

标签: mysql

我正在尝试找到一种方法来检索表中两列的每个值组合,其中每个组合与第三列中的值匹配。

说表的一部分如下:

products_id     options_id     options_values_id
1487            2              1
1487            2              61
1487            3              60 
1487            5              52

使用products_id 1487时,我想要的输出将是以下两个字符串:

2-1, 3-60, 5-52
2-61, 3-60, 5-52

我的印象是这些字符串需要递归组装,但是我遇到了这样的问题,因为不是每个products_id都有相同的options_ids,或者它们的数量相同。

编辑添加:我尝试了以下几种解决方案的变体,但无济于事。我想我应该更具描述性。

我正在尝试检索 unique options_id及其相应的options_values_id的每个组合。 (换句话说,并非这两个列中的每个可能的数字组合。)Options_id表示“颜色”和“大小”等产品选项,而options_values_id表示这些选项的选项,如“红色”或“小”。因此,我正在努力为给定的products_id提供所有可能的选项组合。在上面的示例中,该项目有两种可能的选项组合 - “2-1,3-60,5-52”和“2-61,3-60,5-52”。

3 个答案:

答案 0 :(得分:-1)

为每个不同的选项加入表格。

先执行选择以检索选项数。

$tables = array();
$rs = mysql_query(
  'SELECT DISTINCT options_id FROM table WHERE products_id = '.$id);
while ($row = mysql_fetch_row($rs)) {
  $tables[$row['options_id']] =
    'SELECT options_values_id FROM table WHERE products_id = '.$id.
    ' AND options_id = '.$row['options_id'];
}
mysql_free_result($rs);

然后,对于每个选项,将其作为查询中的单独表加入。不要包含任何比较值的连接子句,只需将每条记录与其他每条记录连接起来。

$sql = 'SELECT ';
$count = 0;
foreach ($tables AS $id => $query) {
  if ($count++) $sql .= ', ;
  $sql .= 'table_'.$id.'.options_values_id AS value_'.$id;
}
$sql .= ' FROM ';
$count = 0;
foreach ($tables AS $id => $query) {
  if ($count++) $sql .= ', ';
  $sql .= '('.$query.') AS table_'.$id;
}

最后,执行该查询。每行options_id将包含一列。每个唯一值组合将有一行。

答案 1 :(得分:-1)

或者对于混合的php / sql方法,请尝试使用该SQL查询:

SELECT products_id, options_id, options_values_id WHERE products_id = '$var_with_product_id';

将结果提取到数组中,比如$ results:

$pairs = array();
foreach($results as $result) {
    // build array with pairs (array_push to avoid overwriting)
    array_push($pairs, array( $result['options_id'] => $result['options_values_id'];
}
// a bit extra complication, as array_push adds e.g. [0] => array( options_id => options_values_id ) :)
$pairs = array_values($pairs);
// check for double options_id
$found_double_options_id = false;
do {
    // check for duplicates... use a lot of array functions
} while (count($pairs) && $found_double_options_id);

答案 2 :(得分:-1)

“每个组合”都是Cartesian product

SELECT DISTINCT e1.options_id, e2.options_values_id
  FROM Entity e1, Entity e2
  WHERE e1.products_id = 1487 AND e2.products_id=1487