原始表:
N tag1 tag2 tag3 tag4 tag5 tag6 countBlankRU countBlankEN countLetterRU countLetterEN countOrderRU countOrderEn
1 y y y n n n 50 100 10 null null null
2 n y n y n n null 50 null 50 null null
我想分割为:
记录1
N countBlankRU
1 50
记录2
N countBlankEN
1 100
记录3
N countLetterRU
1 10
记录4
N countBlankEN
2 50
记录5
N countLetterEN
2 50
答案 0 :(得分:5)
您要寻找的基本结构是unpivot:
<html>
<head>
<title>Pagination</title>
</head>
<body>
<?php
$conn = mysqli_connect('localhost','root','','northwind');
$data_per_page = 10;
$select = "SELECT * FROM `customers`";
$select_run = mysqli_query($conn, $select);
$records = mysqli_num_rows($select_run);
// while ($result = mysqli_fetch_array($select_run)) {
// echo $result['CompanyName'] . '<br>';
// }
// $records;
echo "<br>";
$no_of_page = ceil($records / $data_per_page);
if(!isset($_GET['page'])){
$page = 1;
}else{
$page = $_GET['page'];
}
$page_limit_data = ($page - 1) * 10;
$select = "SELECT * FROM customers LIMIT " . $page_limit_data . ',' . $data_per_page ;
$select_run = mysqli_query($conn, $select);
while ($row_select = mysqli_fetch_array($select_run)){
echo $row_select['CompanyName'] . '<br>' ;
}
for($page=1; $page<= $no_of_page; $page++){
echo "<a href='pagination.php?page=$page'> $page" . ', ';
}
?>
<br>
<h1> Testing Limit Functions Here </h1>
<?php
$limit = "SELECT CompanyName From customers LIMIT 10 OFFSET 5";
$limit_run = mysqli_query($conn , $limit);
while($limit_result = mysqli_fetch_array($limit_run)){
echo $limit_result['CompanyName'] . '<br>';
}
?>
</body>
</html>
您可以使用任何您喜欢的文本代替上面示例中的标签号,并且您似乎想要多列,您也可以这样做:
select n, tag
from your_table
unpivot(flag for tag in (tag1 as 1, tag2 as 2, tag3 as 3, tag4 as 4, tag5 as 5, tag6 as 6))
where flag = 'y';
N TAG
---------- ----------
1 1
1 2
1 3
2 2
2 4
或者如果文本来自源行的另一列,并且您想为每个未透视的行都包含相同的文本,则类似:
select n, fieldiftag, fieldiftag2
from your_table
unpivot(flag for (fieldiftag, fieldiftag2) in (
tag1 as ('tag 1 text 1', 'tag 1 text 2'),
tag2 as ('tag 2 text 1', 'tag 3 text 2'),
tag3 as ('tag 3 text 1', 'tag 4 text 2'),
tag4 as ('tag 4 text 1', 'tag 5 text 2'),
tag5 as ('tag 5 text 1', 'tag 6 text 2'),
tag6 as ('tag 6 text 1', 'tag 7 text 2')
))
where flag = 'y';
N FIELDIFTAG FIELDIFTAG2
---------- ------------ ------------
1 tag 1 text 1 tag 1 text 2
1 tag 2 text 1 tag 3 text 2
1 tag 3 text 1 tag 4 text 2
2 tag 2 text 1 tag 3 text 2
2 tag 4 text 1 tag 5 text 2
或者为每个标记匹配从源表的不同列中选取文本值:
with your_table (N, tag1, tag2, tag3, tag4, tag5, tag6, text) as (
select 1, 'y', 'y', 'y', 'n', 'n', 'n', 'text from row 1' from dual
union all select 2, 'n', 'y', 'n', 'y', 'n', 'n', 'text from row 2' from dual
)
select n, text
from your_table
unpivot(flag for tag in (tag1 as 1, tag2 as 2, tag3 as 3, tag4 as 4, tag5 as 5, tag6 as 6))
where flag = 'y';
N TEXT
---------- ---------------
1 text from row 1
1 text from row 1
1 text from row 1
2 text from row 2
2 text from row 2
您可以将每个标签匹配项扩展为多个文本列:
with your_table (N, tag1, tag2, tag3, tag4, tag5, tag6,
fieldiftag1_1, fieldiftag2_1, fieldiftag3_1, fieldiftag4_1, fieldiftag5_1, fieldiftag6_1)
as (
select 1, 'y', 'y', 'y', 'n', 'n', 'n',
'text1_1', 'text2_1', 'text3_1', null, null, null
from dual
union all select 2, 'n', 'y', 'n', 'y', 'n', 'n',
null, 'text2_1', null, 'text4_1', null, null
from dual
)
select n, text
from your_table
unpivot((flag, text) for tag in (
(tag1, fieldiftag1_1),
(tag2, fieldiftag2_1),
(tag3, fieldiftag3_1),
(tag4, fieldiftag4_1),
(tag5, fieldiftag5_1),
(tag5, fieldiftag6_1)))
where flag = 'y';
N TEXT
---------- -------
1 text1_1
1 text2_1
1 text3_1
2 text2_1
2 text4_1
等
答案 1 :(得分:3)
您可以使用UNPIVOT
并在值为y
时进行过滤以获取记录。除此之外,还不清楚您的text
值来自何处或额外的fieldIFtagN_M
列的用途是什么。
Oracle 11g R2架构设置:
CREATE TABLE table_name ( N, tag1, tag2, tag3, tag4, tag5, tag6 ) AS
SELECT 1, 'y', 'y', 'y', 'n', 'n', 'n' FROM DUAL UNION ALL
SELECT 2, 'n', 'y', 'n', 'y', 'n', 'n' FROM DUAL;
查询1 :
SELECT N, tag, 'text'
FROM table_name
UNPIVOT ( value FOR tag IN ( tag1, tag2, tag3, tag4, tag5, tag6 ) )
WHERE value = 'y'
Results :
| N | TAG | 'TEXT' |
|---|------|--------|
| 1 | TAG1 | text |
| 1 | TAG2 | text |
| 1 | TAG3 | text |
| 2 | TAG2 | text |
| 2 | TAG4 | text |
更新,包括一些其他字段:
Oracle 11g R2架构设置:
CREATE TABLE table_name (
N, tag1, tag2, tag3, tag4, tag5, tag6,
fieldIF1, fieldIF2, fieldIF3, fieldIF4, fieldIF5, fieldIF6
) AS
SELECT 1, 'y', 'y', 'y', 'n', 'n', 'n', '1,1', '1,2', '1,3', '1,4', '1,5', '1,6' FROM DUAL UNION ALL
SELECT 2, 'n', 'y', 'n', 'y', 'n', 'n', '2,1', '2,2', '2,3', '2,4', '2,5', '2,6' FROM DUAL;
查询1 :
SELECT N,
tag,
CASE tag
WHEN 'TAG1' THEN fieldIF1
WHEN 'TAG2' THEN fieldIF2
WHEN 'TAG3' THEN fieldIF3
WHEN 'TAG4' THEN fieldIF4
WHEN 'TAG5' THEN fieldIF5
WHEN 'TAG6' THEN fieldIF6
END AS fieldIF
FROM table_name
UNPIVOT (
value FOR tag IN ( tag1, tag2, tag3, tag4, tag5, tag6 )
)
WHERE value = 'y'
Results :
| N | TAG | FIELDIF |
|---|------|---------|
| 1 | TAG1 | 1,1 |
| 1 | TAG2 | 1,2 |
| 1 | TAG3 | 1,3 |
| 2 | TAG2 | 2,2 |
| 2 | TAG4 | 2,4 |
更新2 -使用更新后的示例数据:
Oracle 11g R2架构设置:
CREATE TABLE table_name (
N,
tag1, tag2,
tag3, tag4,
tag5, tag6,
countBlankRU, countBlankEN,
countLetterRU, countLetterEN,
countOrderRU, countOrderEn
) AS
SELECT 1, 'y', 'y', 'y', 'n', 'n', 'n', 50, 100, 10, null, CAST(null AS NUMBER(3,0)), CAST(null AS NUMBER(3,0)) FROM DUAL UNION ALL
SELECT 2, 'n', 'y', 'n', 'y', 'n', 'n', null, 50, null, 50, null, null FROM DUAL;
查询1 :
SELECT N,
tag,
fieldIF
FROM table_name
UNPIVOT (
(value,fieldIf) FOR tag IN (
(tag1, countBlankRU) AS 'CountBlankRU',
(tag2, countBlankEN) AS 'CountBlankEN',
(tag3, countLetterRU) AS 'CountLetterRU',
(tag4, countLetterEN) AS 'CountLetterEN',
(tag5, countOrderRU) AS 'CountOrderRU',
(tag6, countOrderEN) AS 'CountOrderEN'
)
)
WHERE value = 'y'
Results :
| N | TAG | FIELDIF |
|---|---------------|---------|
| 1 | CountBlankRU | 50 |
| 1 | CountBlankEN | 100 |
| 1 | CountLetterRU | 10 |
| 2 | CountBlankEN | 50 |
| 2 | CountLetterEN | 50 |