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;