如何选择不同col1和空col2的行

时间:2015-07-03 15:56:47

标签: mysql sql

我的表:

// mytable
+-----+----------+--------------+
| id  |  number  |     name     |
+-----+----------+--------------+
|  1  |    1     |    red       |
|  2  |    1     |              |
|  3  |    1     |              |
|  4  |    2     |    blue      |
|  5  |    2     |              |
|  6  |    3     |              |
|  7  |    3     |              |
|  8  |    3     |              |
|  9  |    4     |              |
|  10 |    4     |              |
+-----+----------+--------------+

现在我想要这个输出:id=6id=9(不同的数字和名称为空)类似这样的内容:

// mynewtable
+-----+----------+--------------+
| id  |  number  |     name     |
+-----+----------+--------------+
|  6  |    3     |              |
|  9  |    4     |              |
+-----+----------+--------------+

我的查询:

SELECT * FROM mytable group by number where name='' order by id ASC;

我的错误:

  

警告: mysql_fetch_assoc():提供的参数不是有效的MySQL   行{x}

上{addres}的结果资源

我该如何解决?

3 个答案:

答案 0 :(得分:1)

这将运作良好,经过自我测试!

SELECT id, number 
FROM `table` 
WHERE name='' and number not in(select number from `table` where name !='') 
GROUP BY number
ORDER BY id

指向:如果行数过多(实际上),则应使用 index

答案 1 :(得分:0)

Mea culpa,我的代码中有一点错误:

SELECT 
    MIN(t.id),
    t.number,
    "" as name
FROM 
(SELECT 
    id, 
    number,
    COUNT(CASE WHEN name <> "" THEN 1 ELSE NULL END) AS count_not_empty
FROM your_table 
GROUP BY number) AS t
WHERE t.count_not_empty =0
GROUP BY t.number

请参阅sqlfiddle(旧输出):http://sqlfiddle.com/#!9/0eda7/6/0 请参阅新的sqlfiddle(询问新输出):http://sqlfiddle.com/#!9/0eda7/12/0

如果出现错误,我会建议您查看您是否与数据库连接良好。你可以尝试类似的东西:

$result = mysql_query(" you query here ");
if (!$result) {
    echo mysql_error();
    exit;
}

如果它&#34;回声&#34;错误,给我们错误,以便我们找到解决方案。

答案 2 :(得分:0)

作为

  • 您评论 id 列不存在,
  • 从数据的角度来看,任何行(6,7,8)和(9,10)中的任何一行都应该是好的,

以下一项可能对您有用(取决于您是否确实需要检查空字符串或 NULL ):

SELECT DISTINCT
  number
  , MAX(name) AS name
FROM mytable
GROUP BY number
HAVING MAX(name) IS NULL
;   

SELECT DISTINCT
  number
  , MAX(name) AS name
FROM mytable
GROUP BY number
HAVING MAX(name) = ''
;

在行动中看到它:SQL Fiddle
因为它不需要子选择,所以它可以提供性能增益 - 特别是使用组合所检查的两列的索引(取决于实际数据分布)。 - 你有(根据chat)+100,000行真实数据来检查......; - )

如果需要调整/进一步详细说明,请发表评论。