是否有可能在MySQL中选择一行然后错过4行然后错过3行然后错过5行然后将其循环直到表的末尾?
我在网上找到了一些LIMIT和OFFSET教程,它们可以工作,但只适用于一套。我需要多个。
我目前有这个设置在PHP中工作,但我觉得我的PHP代码很臃肿,因为我只知道实现这个的基本方法。
我的PHP代码如下
$int_count = 0;
$result = mysql_query("SELECT * FROM guitar_tunings_chords WHERE note_id >= '27'");
while ( $row = mysql_fetch_array($result) ) {
if ($int_count == 0)$n_1 = ($row["note"]);
if ($int_count == 4)$n_2 = ($row["note"]);
if ($int_count == 7)$n_3 = ($row["note"]);
if ($int_count == 12)$n_4 = ($row["note"]);
if ($int_count == 16)$n_5 = ($row["note"]);
if ($int_count == 19)$n_6 = ($row["note"]);
if ($int_count == 24)$n_7 = ($row["note"]);
if ($int_count == 28)$n_8 = ($row["note"]);
if ($int_count == 31)$n_9 = ($row["note"]);
if ($int_count == 36)$n_10 = ($row["note"]);
if ($int_count == 40)$n_11 = ($row["note"]);
if ($int_count == 43)$n_12 = ($row["note"]);
if ($int_count == 48)$n_13 = ($row["note"]);
if ($int_count == 52)$n_14 = ($row["note"]);
$int_count++;
}
我要做的是只选择大比例的主要三联音符。
我需要能够从表格中选择基本音符,然后以3个不同的间隔选择以创建和弦。
更新
$result2 = mysql_query("SELECT *
FROM `guitar_tunings_links`
JOIN guitar_tunings_chords ON guitar_tunings_links.".$funtion_string." = guitar_tunings_chords.note
WHERE tuning = '".$chrd_tn."'") or die(mysql_error());
while ( $row = mysql_fetch_array($result2) ) {
$bridge_note = ($row["note_id"]);
}/*
var_dump ($key_note);
var_dump ($bridge_note);
var_dump ($funtion_string);
var_dump ($chrd_tn);*/
// SELECT * FROM `guitar_tunings_chords` WHERE `note_id` >= 28 LIMIT 0,8
$result4 = mysql_query("SELECT * FROM `guitar_tunings_chords` WHERE `note_id` >= ".$bridge_note." LIMIT ".$tuning_capo.",8") or die(mysql_error());
while ( $row = mysql_fetch_array($result4) ) {
//Notes
$note = ($row["note"]);
// Replace # with z
$note = str_replace("#", "z", $note);
// Distinguish nut notes on or off
if (preg_match("/\b".$note."\b/i", $notes_array)) {
$n_nut_style = 'note_nut_on';
} else { $n_nut_style = 'note_nut_off';
}
// Distinguish fretboard notes on or off
if (preg_match("/\b".$note."\b/i", $notes_array)) {
$n_style = 'note_on';
} else { $n_style = 'note_off';
}
答案 0 :(得分:2)
你必须将它应用于你的确切表格,但它应该工作得很好。
select *
from (select @i := @i+1 as count,
gtc.* from guitar_tunings_chords gtc
where note_id >= 27) counts
join (select @i := -1 as counter) dummy
where count % 12 = 0
or (count-4) % 12 = 0
or (count-7) % 12 = 0;
%12给出一个完整的跳过周期,-4和-7(和-0)是每个周期内的内部偏移。
答案 1 :(得分:0)
尝试这个......我自己没有尝试过,但在我的脑海中它应该可以工作:)
$row_count = 0;
$result = mysql_query("SELECT * FROM guitar_tunings_chords WHERE note_id >= '27'");
$notes = array(); // Notes array
$pattern = array(4,3,5); // Pattern to skip notes
$i = 0; // For pattern position
$first = true;
while ($row = mysql_fetch_array($result)) {
if($first) { // Add the first note
$notes[] = $row["note"];
$first = false;
} else {
if($row_count == $pattern[$i]) {
// Add note
$notes[] = $row["note"];
$i++; // Change pattern position
// Jump to start of pattern
if($i == 3)
$i = 0;
// Reset count
$row_count = -1;
}
}
$row_count++;
}
答案 2 :(得分:0)
我考虑使用带有间隔(0,4,7,12,16,19等)的chord_note表并将其用作SELECT的一部分,添加初始的note_id值(27)+条目在chord_note表中
SELECT *
FROM guitar_tunings_chords
WHERE note_id IN ( SELECT 27+chord_interval
FROM chord_note
)
获得更多幻想,您甚至可以扩展chord_note表以保存不同比例的不同inteval细节,只需修改子选择