简体   繁体   English

使用PHP和MySQL从多个表的多个列中选择DISTINCT

[英]Select DISTINCT from multiple columns of multiple tables with PHP and MySQL

Using PHP and MySQL I'm trying to get all the distinct values out the number and type columns from all 4 of the tables listed below: 我试图使用PHP和MySQL从下面列出的所有4个表的number和type列中获取所有不同的值:

table_1

ID|t1_number|t1_type
1|1|new
2|1|old
3|2|new
4|3|new
5|1|old

table_2

ID|t2_number|t2_type
1|1|future
2|1|new
3|3|past
4|3|new
5|1|new

table_3

ID|t3_number|t3_type
1|1|past
2|1|new
3|1|new
4|1|new
5|1|old

table_4

ID|t4_number|t4_type
1|1|new
2|4|new
3|3|old
4|2|new
5|1|new

The values I want from the above tables would be: 我想要的上表中的值是:

numbers: 1,2,3,4 数字:1,2,3,4

types: new,old,future,past 类型:新的,旧的,未来的,过去的

Here is what I have so far; 这是我到目前为止所拥有的; but I'm not sure if the SQL is correct or how to format the while loop to get the values out. 但是我不确定SQL是否正确或如何格式化while循环以获取值。

$sql = "SELECT DISTINCT table_1.t1_number, table_2.t2_number, table_3.t3_number, table_4.t4_number, table_1.t1_type, table_2.t2_type, table_3.t3_type, table_4.t4_type
FROM table_1 
JOIN table_2
JOIN table_3
JOIN table_4";

$result = @mysql_query($sql, $con) or die(mysql_error());

while($row = mysql_fetch_array($result)) {

    $numbers= $row[?????????];

}

Doing this in a single query risks duplicating a value in the output for either the number or type column, in the case that one list has more values than the other. 如果一个列表的值比另一个列表多,则在单个查询中执行此操作可能会在输出中为number或type列复制值。 To get a distinct list of values for either column, this needs to be separate queries: 为了获得任一列的不同值列表,这需要单独的查询:

Number

SELECT t1_number AS num
  FROM TABLE_1
UNION
SELECT t2_number
  FROM TABLE_2
UNION
SELECT t3_number
  FROM TABLE_3
UNION
SELECT t4_number
  FROM TABLE_4

Type 类型

SELECT t1_type AS type
  FROM TABLE_1
UNION
SELECT t2_type
  FROM TABLE_2
UNION
SELECT t3_type
  FROM TABLE_3
UNION
SELECT t4_type
  FROM TABLE_4

There's no value to running DISTINCT in this UNION query, because duplicates will be removed, and this deals with only one column. 在此UNION查询中运行DISTINCT没有任何价值,因为将删除重复项,并且此处理仅处理一列。

It's not completely clear what you're asking for. 尚不清楚您要的是什么。 Do you want the four distinct numbers, and then the four distinct types? 您要四个不同的数字,然后四个不同的类型吗?

SELECT t1_number FROM table_1
UNION SELECT t2_number FROM table_2
UNION SELECT t3_number FROM table_3
UNION SELECT t4_number FROM table_4;

SELECT t1_type FROM table_1
UNION SELECT t2_type FROM table_2
UNION SELECT t3_type FROM table_3
UNION SELECT t4_type FROM table_4;

Or do you want each distinct pair of number & type? 还是您想要每对不同的数字和类型?

SELECT t1_number, t1_type FROM table_1
UNION SELECT t2_number, t2_type FROM table_2
UNION SELECT t3_number, t3_type FROM table_3
UNION SELECT t4_number, t4_type FROM table_4;

The neat thing about UNION is that it implicitly reduces the result to distinct rows. 关于UNION的一件整洁的事情是,它隐式地将结果减少到不同的行。 You can preserve duplicates if you use UNION ALL. 如果使用UNION ALL,则可以保留重复项。

With SQL: 使用SQL:

SELECT DISTINCT t1_number AS num FROM t1
    WHERE num NOT IN (SELECT t2_number FROM t2)
    AND num NOT IN (SELECT t3_number FROM t3)
    AND num NOT IN (SELECT t4_number FROM t4)

The same idea will work for the types. 同样的想法适用于类型。

I think this is what you want: 我认为这是您想要的:

select distinct number_value, type_value from (
  select t1_number as number_value, t1_type as type_value from table_1
union
  select t2_number as number_value, t2_type as type_value from table_2
union
  select t3_number as number_value, t3_type as type_value from table_3
union
  select t4_number as number_value, t4_type as type_value from table_4
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM