Mysql SQL-使用多种条件在每列之间打印多个单词

Mysql SQL-使用多种条件在每列之间打印多个单词,mysql,Mysql,好的,首先我有不可变的值: 4 8 16 32 64 128 256 我有一张这样的桌子: +----+------+---------------------+-------------+ | id | full_name | club_name | y_of_birth | +----+------+---------------------+-------------+ | 1 | Ahmed Sayed | El Ahly | 20

好的,首先我有不可变的值:

4   8   16   32   64   128   256
我有一张这样的桌子:

+----+------+---------------------+-------------+
| 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     |
+----+------+---------------------+-------------+
+--------------+-------------+
|   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** |             |
+--------------+-------------+
+--------------+-------------+
|   full_name  |  club_name  |
+--------------+-------------+
| Ahmed Sayed  |  El Ahly    |
+----+------+--+-------------+
| **ANY WORD** |             |
+--------------+-------------+
| Kareem Gaber |  El Ahly    |
+------+-------+-------------+
| Kamal saber  |  wadi dgla  |
+--------------+-------------+
我还尝试用query从数据库中过滤数据

从y_出生=2000的球员中选择全名、俱乐部名

结果是
5
玩家应该是这样的:

+--------------+--------------+
|   full_name  |  club_name   |
+--------------+--------------+
| Ahmed Sayed  |   El Ahly    |
+----+------+--+--------------+
| Kareem Gaber |   El Ahly    |
+------+-------+--------------+
| Kamal saber  |  wadi dgla   |
+------+-------+--------------+
| omar galal   |   Cocorico   |
+------+-------+--------------+
| Mohamed gad  |  Ismaily     |
+------+-------+--------------+
好的,条件是:

如果结果大于4<代码>>4且小于8<代码>新的和改进的(第3版),则使用变量并使用基本相同的技巧:

这应该适用于任何大小的结果;只需将条件(
y\u of_birth=2000
)更改为您想要的任何条件。为了测试这一点,我升级到MySQL 5.6(事实证明,这有一点不同)

基本技巧是使用
联合
创建一个具有静态值的两行表(在本例中为
1
0
),然后
左连接
,将其与实际结果进行多次合并,以达到2的幂。这意味着我们必须计算结果中每一行的数量(称为
row\u num
),以便我们能够正确地制定连接条件。最后,每这么多行生成一个重复的行;最后一点是通过检查我们是在真行还是假行(
1
0
)来更改我们在这些重复项上选择的内容(使用
IF
s)

这应该防止同一队的球员彼此相邻,除非这是不可能的,因为一个队有太多的球员;请参阅上面的链接,了解有关如何执行此操作的更多信息。基本的想法是按俱乐部排序,然后从列表的上半部分和下半部分交替挑选


最后一个技巧是计算虚拟行的数量和连接位置。在尝试了几件事情之后,我意识到这其实非常简单:只需连接每一行,直到达到所需的虚拟行数(
@extra
)。但是,这将在结果顶部打包所有虚拟行;要将它们更分散(不是完全分散,而是更分散),请计算我们需要添加一行(
FLOOR(@count/@extra)
)的频率,然后每隔那么多行放置一行(处于条件下的
的第一部分),直到添加了足够的行(第二部分)。

以下过程将返回4列。应显示第一列和第二列。第三列只是应该忽略的rownum。如果第四列不是空的,则在下一行显示它,否则不显示它

DELIMITER //
create procedure test()
BEGIN
declare N int;
declare X int;
select count(*) from players where y_of_birth=2000 into N;
set X = power(2,ceil(log2(N))) -N;
SELECT full_name, club_name, @row := @row + 1 AS row, 
case when (@row<= X) 
then 'any word' else '' end r
FROM players, (SELECT @row:=0) z
where y_of_birth=2000;
END //
DELIMITER 

call test;
分隔符//
创建过程测试()
开始
声明N int;
声明X int;
从y_出生=2000的玩家中选择count(*)进入N;
设置X=功率(2,ceil(log2(N))-N;
选择全名、俱乐部名、@row:=@row+1作为行,

当(@row您是手动查询数据库?还是使用任何编程语言?@mustangDC是的,使用php,但我想从数据库中获取所有结果,结果与问题中的结果相同!我想…您应该获得
选择
结果的
计数
,并以编程方式迭代
选择
查询
结果nt
次数。@mustangDC是的,但问题是在我的代码的最后部分打印了任何单词,我有很多div,这让我非常紧张,所以我希望这里的人能给我一个简单的方法在mysql我的比赛括号应用程序中这样做。试着运行
选择…从…
而不是关闭任何其他东西。它会为您提供列标题的结果我非常感谢您的输入,谢谢。但我尝试了您的查询,但它给了我许多相邻的
**任何单词**
检查此项请@authprivate您使用的是什么版本的MySQL?我猜您的版本和我的版本之间存在默认排序不同的问题version.it’s a phpmyadmin,mysql的版本是
5.6.21
@Austin看看这篇文章,答案是正确的,一个挨一个或更高的
club_name
latest query@authprivate改善了
**任何单词的传播;它并不完美,但应该足够好。感谢您的努力和支持感谢回复,但兄弟我不知道问题出在哪里这是在mysql中发现的语法错误@authprivate的问题,不确定sqlfiddle@authprivate我的意思是说,在我修改mysqlim后,它可以工作。我真的很抱歉回答的太晚了,但问题是我在使用phpmyadmin,我正在尝试和搜索如何调用
 phpmyadmin上的过程测试
,我对sqlfiddle做了同样的错误。@authprivate对于sql fiddle,在构建架构的左侧定义过程。在第一行中省略“DELIMITER//”,在最后一行中省略“DELIMITER”。然后在下面有[build schema][Edit Fullscreen][Browser]和[;]按钮,选择最后一个按钮并选择//作为查询终止符。请确保使用我删除逗号的更新过程
4 8 16 32 64 128 256
+--------------+-------------+
|   full_name  |  club_name  |
+--------------+-------------+
| Ahmed Sayed  |  El Ahly    |
+----+------+--+-------------+
| **ANY WORD** |             |
+--------------+-------------+
| Kareem Gaber |  El Ahly    |
+------+-------+-------------+
| Kamal saber  |  wadi dgla  |
+--------------+-------------+
+--------------+-------------+
|   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** |             |
+--------------+-------------+
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
+--------------+-----------+
| 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 |
+--------------+-----------+
DELIMITER //
create procedure test()
BEGIN
declare N int;
declare X int;
select count(*) from players where y_of_birth=2000 into N;
set X = power(2,ceil(log2(N))) -N;
SELECT full_name, club_name, @row := @row + 1 AS row, 
case when (@row<= X) 
then 'any word' else '' end r
FROM players, (SELECT @row:=0) z
where y_of_birth=2000;
END //
DELIMITER 

call test;