好的,首先我有不可变的值:
4 8 16 32 64 128 256
Run Code Online (Sandbox Code Playgroud)
我有一张这样的表:
+----+------+---------------------+-------------+
| id | full_name | club_name | y_of_birth |
+----+------+---------------------+-------------+
| 1 | Ahmed Sayed | El Ahly | 2000 |
+----+------+---------------------+-------------+
| 2 | Kareem Gaber | El Ahly | 2000 |
+----+------+---------------------+-------------+
| 3 | Maher Zein | El Ahly | 2003 |
+----+------+---------------------+-------------+
| 4 | Mohab Saeed | El Ahly | 2003 |
+----+------+---------------------+-------------+
| 5 | Kamal saber | wadi dgla | 2000 |
+----+------+---------------------+-------------+
| 6 | gamel kamel | el-nasr | 2002 |
+----+------+---------------------+-------------+
| 7 | omar galal | Cocorico | 2000 |
+----+------+---------------------+-------------+
| 8 | Kamal saber | Cocorico | 2004 |
+----+------+---------------------+-------------+
| 9 | Mohamed gad | Ismaily | 2000 |
+----+------+---------------------+-------------+
| 10 | ehab zeyad | Ismaily | 2005 |
+----+------+---------------------+-------------+
| 11 | moaz maged | Smouha | 2001 |
+----+------+---------------------+-------------+
| 12 | mazen mahmod | elmasry | 2006 |
+----+------+---------------------+-------------+
| 13 | ahmed shawky | Petroget | 2002 |
+----+------+---------------------+-------------+
| 14 | shaker ali | Petroget | 2007 |
+----+------+---------------------+-------------+
Run Code Online (Sandbox Code Playgroud)
我试图用查询过滤数据库中的数据
select full_name,club_name from players where y_of_birth=2000
结果是5玩家应该是这样的:
+--------------+--------------+
| full_name | club_name |
+--------------+--------------+
| Ahmed Sayed | El Ahly |
+----+------+--+--------------+
| Kareem Gaber | El Ahly |
+------+-------+--------------+
| Kamal saber | wadi dgla |
+------+-------+--------------+
| omar galal | Cocorico |
+------+-------+--------------+
| Mohamed gad | Ismaily |
+------+-------+--------------+
Run Code Online (Sandbox Code Playgroud)
好的条件是:
如果结果大于 4 > 4且小于 8 <= 8则将结果放入8我们的情况下结果是5它意味着8 - 5 = 3 平均迭代这个单词3次结果应该是这样的:
+--------------+-------------+
| full_name | club_name |
+--------------+-------------+
| Ahmed Sayed | El Ahly |
+----+------+--+-------------+
| **ANY WORD** | |
+--------------+-------------+
| Kareem Gaber | El Ahly |
+------+-------+-------------+
| Kamal saber | wadi dgla |
+------+-------+-------------+
| **ANY WORD** | |
+--------------+-------------+
| omar galal | Cocorico |
+------+-------+-------------+
| Mohamed gad | Ismaily |
+------+-------+-------------+
| **ANY WORD** | |
+--------------+-------------+
Run Code Online (Sandbox Code Playgroud)
注意:请不要在**ANY WORD**上面的示例之间相邻:
+------+-------+
| **ANY WORD** |
+--------------+
| **ANY WORD** |
+--------------+
Run Code Online (Sandbox Code Playgroud)
要么
club_name以上示例之间没有相邻:
+------+-------+
| El Ahly |
+--------------+
| El Ahly |
+--------------+
Run Code Online (Sandbox Code Playgroud)
更新 :
另一个例子
它基于这些数字
4 8 16 32 64 128 256
Run Code Online (Sandbox Code Playgroud)
和条件是:
4和> 2则表示(4 - the number of query result) 例如:如果查询结果是3如此4 - 3 = 1,从而1是一个数字的**ANY WORD**,从而所希望的输出将是这样的:
+--------------+-------------+
| full_name | club_name |
+--------------+-------------+
| Ahmed Sayed | El Ahly |
+----+------+--+-------------+
| **ANY WORD** | |
+--------------+-------------+
| Kareem Gaber | El Ahly |
+------+-------+-------------+
| Kamal saber | wadi dgla |
+--------------+-------------+
Run Code Online (Sandbox Code Playgroud)
8
如果查询结果 <= 8和> 4意思(8 - the number of query result) 例如:在查询结果是5如此8 - 5 = 3,从而3是一个数字的**ANY WORD**,从而所希望的输出将是这样的
+--------------+-------------+
| full_name | club_name |
+--------------+-------------+
| Ahmed Sayed | El Ahly |
+----+------+--+-------------+
| **ANY WORD** | |
+--------------+-------------+
| Kareem Gaber | El Ahly |
+------+-------+-------------+
| Kamal saber | wadi dgla |
+------+-------+-------------+
| **ANY WORD** | |
+--------------+-------------+
| omar galal | Cocorico |
+------+-------+-------------+
| Mohamed gad | Ismaily |
+------+-------+-------------+
| **ANY WORD** | |
+--------------+-------------+
Run Code Online (Sandbox Code Playgroud)
等有4和16和32和64...等,直到256.
任何帮助将非常感激 .
新的和改进的(版本3如何)使用变量并使用与这里基本相同的技巧:
SELECT
IF(is_real, '**ANY WORD**', full_name) AS full_name,
IF(is_real, '', club_name) AS club_name
FROM
(
SELECT
full_name,
club_name,
(@row_num2:= @row_num2 + 1) AS row_num
FROM
(
SELECT p3.*
FROM
(
SELECT
p2.*,
(@row_num := @row_num + 1) AS row_num
FROM
(
SELECT *
FROM players AS p1
WHERE y_of_birth = 2000
) AS p2
CROSS JOIN
(
SELECT
@row_num := 0,
@count := (SELECT COUNT(*) FROM players WHERE y_of_birth = 2000)
) AS vars
ORDER BY club_name
) AS p3
ORDER BY row_num % FLOOR(@row_num / 2), row_num
) AS p4
CROSS JOIN
(
SELECT
@row_num2 := -1,
@extra := GREATEST(2, POW(2, CEIL(LOG2(@count)))) - @count) AS vars
) AS data
LEFT JOIN
(
(SELECT 1 AS is_real)
UNION ALL
(SELECT 0 AS is_real)
) AS filler
ON
MOD(row_num, FLOOR(@count / @extra)) = 0 AND
row_num / FLOOR(@count / @extra) < @extra
ORDER BY row_num, is_real
Run Code Online (Sandbox Code Playgroud)
对于您提供的示例数据,这会产生类似以下内容的内容:
+--------------+-----------+
| full_name | club_name |
+--------------+-----------+
| Ahmed Sayed | El Ahly |
| **ANY WORD** | |
| Mohamed gad | Ismaily |
| **ANY WORD** | |
| omar galal | Cocorico |
| **ANY WORD** | |
| Kareem Gaber | El Ahly |
| Kamal saber | wadi dgla |
+--------------+-----------+
Run Code Online (Sandbox Code Playgroud)
这应该适用于任何大小的结果;只需将条件 ( y_of_birth = 2000) 更改为您想要的任何条件即可。我升级到 MySQL 5.6 来测试这一点(结果实际上有一点不同)。
1基本技巧是使用 a 创建一个包含静态值(在本例中为 和0)的两行表UNION,然后LEFT JOIN将其多次填充到实际结果中以填充到 2 的幂。这意味着我们已经计算了数字结果中的每一行(称为row_num),以便我们可以正确地制定连接条件。最后,每隔这么多行就会产生一个重复行;最后一点是IF通过检查我们是否位于真行或假行(1或0)来更改我们在这些重复项上选择的内容(使用 s)。
这应该可以防止同一支球队的球员彼此相邻,除非这是不可能的,因为一支球队有太多球员;有关如何执行此操作的更多信息,请参阅上面的链接。基本思想是按俱乐部排序,然后从该列表的前半部分和后半部分交替挑选。
最后一个技巧是找出虚拟行的数量和位置。在尝试了几件事之后,我意识到这实际上非常简单:只需连接每一行,直到我们达到所需的虚拟行数(@extra)。但是,这会将所有虚拟行打包在结果的顶部;为了将它们分散得更多(不是完美地分散,而是更多地分散),计算我们需要添加一个 ( FLOOR(@count / @extra)) 的频率,然后每隔那么多行添加一个(ON条件的第一部分),直到添加了足够的行(条件的第一部分)第二部分)。
| 归档时间: |
|
| 查看次数: |
450 次 |
| 最近记录: |