程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Doctrine Priority select depends on a field value

发布于2023-01-19 16:46     阅读(318)     评论(0)     点赞(21)     收藏(5)


Regards on this result set from this Query :

Select * from [My_Table]

FK_id| name   | code  |
___________________
1 | first  | 21500 |
___________________
1 | first  | 0     |
___________________
2 | second | 21500 |
___________________
4 | four   | 21500 |
___________________
4 | four   | 42000 |
___________________
4 | four   | 0     |
___________________
5 | fifth  | 0     |
___________________
5 | fifth  | 42000 |
___________________
6 | six  | 0       |
___________________

I need to select lines (distinct Fk_ID) where those condition are satisfied :

If code is different to 0 we take the one with the code we want(its a parameter to the query) If there is no line equal to this parameter we take the one with 0.

This is what I need :

If code = 21500 :

Fk_id| name   | code  |
___________________
1 | first  | 21500 |
___________________
2 | second | 21500 |
___________________
4 | four   | 21500 |
___________________
5 | fifth  | 0     |
___________________
6 | six  | 0       |
___________________

If code = 42000 :

Fk_id| name   | code  |
___________________
1 | first  | 0     |
___________________
4 | four   | 42000 |
___________________
5 | fifth  | 42000 |
___________________
6 | six  | 0       |
___________________

I need to have the SQL queries first, no need to have doctrine Query builder.


解决方案


I added an id column to ease the edition with PHPMyAdmin but it doesn't play any role here.

If code = 21500 :

SELECT * FROM `test`
WHERE (`code` = 21500 OR `code` = 0)
GROUP BY `name`
ORDER BY `FK_id`

Demo at SQL Fiddle.

Result:

| id | FK_id |   name |  code |
|----|-------|--------|-------|
|  1 |     1 |  first | 21500 |
|  3 |     2 | second | 21500 |
|  4 |     4 |   four | 21500 |
|  7 |     5 |  fifth |     0 |
|  9 |     6 |    six |     0 |

If code = 42000 :

SELECT *, MAX(code) FROM `test`
WHERE (`code` = 42000 OR `code` = 0)
GROUP BY `name`
ORDER BY `FK_id`

Demo at SQL Fiddle.

Result:

| id | FK_id |  name |  code | MAX(code) |
|----|-------|-------|-------|-----------|
|  2 |     1 | first |     0 |         0 |
|  5 |     4 |  four | 42000 |     42000 |
|  7 |     5 | fifth |     0 |     42000 |
|  9 |     6 |   six |     0 |         0 |

I use MAX() in order to get 42000 and not 0 on the first line of results.

In both queries you can replace GROUP BY `name` with GROUP BY `FK_id`.



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.phpheidong.com/blog/article/476825/4b2e4269f33f30a1ae1d/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)