我正在为我的俱乐部建立一个网站,其中包含会员列表和发票。我按如下方式设置了我的数据库:
家庭
ID
Family name
Adress
etc.
会员,附有家庭ID
的链接ID
Firstname
Family_ID
发票,带有指向系列数据库或成员数据库的链接
ID
Amount
payed
Family_ID
Member_ID
有时我想为家庭开具发票,例如年度捐款。但有时我想为会员本身开具发票,以便他们正在比赛。
现在我想制作一个看起来有点像下面的概述页面
Family name1
Contribution invoice1
Member1
Match invoice 1
member2
Match invoice 2
Family name2
Contribution invoice2
Member1
Match invoice 3
member2
Match invoice 4
etc....
我当然可以通过它们对所有家庭进行查询。并且每行都会查询家庭成员和查询发票。然后再查询每个成员的发票。但我认为应该有一个更复杂的查询来将它们全部放入大查询中。
我希望我的意思很明确,你们可以帮助我。如果有问题,请告诉我。
答案 0 :(得分:0)
没有演示数据有点难。但是,让我们假设以下方法:首先,我们构建临时inv_combined
- 表(作为from
- 部分中的选择),它将发票与族和成员组合并分配类型{分别为{1}}和contribution
。稍后将使用此member
进行排序。然后,给定这个组合表,我们分别添加了家庭和成员的详细信息。最后,我们按type
排序,以便结果列出每个家庭的所有捐款发票,然后是所有会员发票。
在您的PHP代码中,您只需浏览列表并注意系列名称,类型和成员名字的任何更改,以启动新的部分。
希望它有所帮助(并希望它有效): - )
family.name, type, member.firstname
答案 1 :(得分:0)
我认为,您需要做的是在主查询中创建一个子查询,以某种分隔符加入这些成员和发票。现在,这看起来像一个非常糟糕的查询,实际上它很复杂,但我在应用程序中的多个位置工作。
null
当我构建它时,我遇到了array_filter
值的一些问题,而我只是给了你简单的骨头,尽管我基本上为你的问题重写了整个事情。你需要修改一些foreach数组,以便在最后处理额外的空间,删除所有空字符串(null
应该,但只是确定),并处理class ProductViewHolder extends RecyclerView.ViewHolder {
...
private Transition transition;
ProductViewHolder(CardViewEx view) {
super(view);
...
transition = TransitionInflater.from(recyclerView.getContext())
.inflateTransition(R.transition.price_button_transition);
transition.addTarget(R.id.button_price)
.addTarget(R.id.button_add_to_cart_or_customize)
.addTarget(R.id.view_price);
}
void changePriceButton(int titleRes) {
TransitionManager.beginDelayedTransition((ViewGroup) itemView, transition);
buttonPrice.setVisibility(View.GONE);
buttonAddToCartOrCustomize.setVisibility(View.VISIBLE);
buttonAddToCartOrCustomize.setText(titleRes);
}
void resetPriceButton(boolean withTransition) {
if (withTransition) {
TransitionManager.beginDelayedTransition((ViewGroup) itemView, transition);
}
buttonPrice.setVisibility(View.VISIBLE);
buttonAddToCartOrCustomize.setVisibility(View.GONE);
}
@OnClick(R.id.button_price)
void onPriceClicked() {
listener.onProductPriceClicked(product);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
...
resetPriceButton(false);
}
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
resetPriceButtons();
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
}
void resetPriceButtons() {
int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
ProductViewHolder holder = (ProductViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
if (holder == null || holder.getLayoutPosition() != i) {
// inconsistency
notifyDataSetChanged();
return;
} else {
holder.resetPriceButton(true);
}
}
notifyItemRangeChanged(0, firstVisibleItemPosition);
notifyItemRangeChanged(lastVisibleItemPosition + 1, getItemCount() - (lastVisibleItemPosition + 1));
}
void changePriceButton(long productId, int titleRes) {
int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
boolean found = false;
for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
ProductViewHolder holder = (ProductViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
if (holder == null || holder.getLayoutPosition() != i) {
// inconsistency
notifyDataSetChanged();
return;
} else if (holder.product.getId() == productId) {
holder.changePriceButton(titleRes, true);
found = true;
}
}
if (!found) {
notifyItemRangeChanged(0, firstVisibleItemPosition);
notifyItemRangeChanged(lastVisibleItemPosition + 1, getItemCount() - (lastVisibleItemPosition + 1));
}
}
值。
参考以获得更多帮助(我获得此类查询的帮助):MySQL: Nested GROUP_CONCAT